Beispiel #1
0
 /**
  * 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);
  }