/** * Convert mouse screen coordinates to a <code>StyledText</code> offset. * * @param x screen X-coordinate * @param y screen Y-coordinate * @param absolute if <code>true</code>, coordinates are expected to be absolute screen * coordinates * @return text offset * @see StyledText#getOffsetAtLocation() */ private int getOffsetAtLocation(int x, int y, boolean absolute) { StyledText textWidget = fViewer.getTextWidget(); StyledTextContent content = textWidget.getContent(); Point location; if (absolute) { location = textWidget.toControl(x, y); } else { location = new Point(x, y); } int line = (textWidget.getTopPixel() + location.y) / textWidget.getLineHeight(); if (line >= content.getLineCount()) { return content.getCharCount(); } int lineOffset = content.getOffsetAtLine(line); String lineText = content.getLine(line); Point endOfLine = textWidget.getLocationAtOffset(lineOffset + lineText.length()); if (location.x >= endOfLine.x) { return lineOffset + lineText.length(); } try { return textWidget.getOffsetAtLocation(location); } catch (IllegalArgumentException iae) { // we are expecting this return -1; } }
/** * Writes data in BrailleZephyr file format to <code>Writer</code>. * * @param writer the writer stream to write the data. * @exception IOException * @see #readBZY(Reader) */ public void writeBZY(Writer writer) throws IOException { // write configuration lines writer.write("Version " + versionMajor + ' ' + versionMinor + ' ' + versionPatch + eol); writer.write("CharsPerLine " + charsPerLine + eol); writer.write("LinesPerPage " + linesPerPage + eol); writer.write("CaretOffset " + currentText.getCaretOffset() + eol); writer.write("ViewFocus "); if (currentText == brailleText) writer.write("braille" + eol); else writer.write("ascii" + eol); if (content.getCharCount() > 0) writer.write( "ReturnAtEnd " + (content.getLine(content.getLineCount() - 1).length() == 0) + eol); else writer.write("ReturnAtEnd false" + eol); writer.write("HeaderEnd" + eol); // write first line String line = content.getLine(0); if (line.length() > 0 && line.charAt(line.length() - 1) == PARAGRAPH_END) writer.write(line.substring(0, line.length() - 1) + (char) 0xb6); else writer.write(line); // write text for (int i = 1; i < content.getLineCount(); i++) { writer.write(eol); line = content.getLine(i); if (line.length() > 0 && line.charAt(line.length() - 1) == PARAGRAPH_END) writer.write(line.substring(0, line.length() - 1) + (char) 0xb6); else writer.write(line); } writer.flush(); resetChanges(); }
/** * Reads data in BrailleZephyr file format from <code>Reader</code>. * * @param reader the reader stream from which to read the data. * @exception IOException * @see #writeBZY(Writer) */ public void readBZY(Reader reader) throws IOException, BZException { String line; boolean returnAtEnd = false; int caretOffset = 0; int unknown = 0; content.setText(""); eol = System.getProperty("line.separator"); BufferedReader buffer = new BufferedReader(reader); // read configuration lines header: while ((line = buffer.readLine()) != null) { String tokens[] = line.split(" "); switch (tokens[0]) { // don't do anything for now case "Version": break; case "CharsPerLine": charsPerLine = Integer.parseInt(tokens[1]); break; case "LinesPerPage": linesPerPage = Integer.parseInt(tokens[1]); break; case "CaretOffset": caretOffset = Integer.parseInt(tokens[1]); break; case "ViewFocus": if (tokens[1].equals("braille")) { if (brailleText.isVisible()) brailleText.setFocus(); } else if (tokens[1].equals("ascii")) { if (asciiText.isVisible()) asciiText.setFocus(); } else logWriter.println("ERROR: Invalid ViewFocus value: " + line); break; case "ReturnAtEnd": returnAtEnd = Boolean.parseBoolean(tokens[1]); break; case "HeaderEnd": break header; default: logWriter.println("WARNING: Unknown file format parameter: " + line); unknown++; if (unknown > 6) throw new BZException("Invalid file format"); break; } } if (line == null) throw new BZException("Invalid file format"); // read first line, may be null for empty document if ((line = buffer.readLine()) != null) { if (line.length() > 0 && line.charAt(line.length() - 1) == 0xb6) content.replaceTextRange(0, 0, line.substring(0, line.length() - 1) + PARAGRAPH_END); else content.replaceTextRange(0, 0, line); // read next lines while ((line = buffer.readLine()) != null) { content.replaceTextRange(content.getCharCount(), 0, eol); if (line.length() > 0 && line.charAt(line.length() - 1) == 0xb6) content.replaceTextRange( content.getCharCount(), 0, line.substring(0, line.length() - 1) + PARAGRAPH_END); else content.replaceTextRange(content.getCharCount(), 0, line); } } if (returnAtEnd) content.replaceTextRange(content.getCharCount(), 0, eol); clearChanges(); brailleText.setCaretOffset(caretOffset); asciiText.setCaretOffset(caretOffset); }