Search in sources :

Example 11 with TextPane

use of org.apache.pivot.wtk.TextPane in project pivot by apache.

the class TextPaneSkin method focusedChanged.

@Override
public void focusedChanged(Component component, Component obverseComponent) {
    super.focusedChanged(component, obverseComponent);
    TextPane textPane = getTextPane();
    if (textPane.isFocused() && textPane.getSelectionLength() == 0) {
        scrollCharacterToVisible(textPane.getSelectionStart());
        showCaret(true);
    } else {
        showCaret(false);
    }
    repaintComponent();
}
Also used : TextPane(org.apache.pivot.wtk.TextPane)

Example 12 with TextPane

use of org.apache.pivot.wtk.TextPane in project pivot by apache.

the class TextPaneSkin method layout.

@Override
public void layout() {
    if (documentView != null) {
        TextPane textPane = getTextPane();
        int width = getWidth();
        int breakWidth;
        if (wrapText) {
            breakWidth = Math.max(width - margin.getWidth(), 0);
        } else {
            breakWidth = Integer.MAX_VALUE;
        }
        documentView.layout(breakWidth);
        documentView.setSkinLocation(margin.left, margin.top);
        updateSelection();
        caretX = caret.x;
        if (textPane.isFocused()) {
            scrollCharacterToVisible(textPane.getSelectionStart());
        }
        showCaret(textPane.isFocused() && textPane.getSelectionLength() == 0);
    }
}
Also used : TextPane(org.apache.pivot.wtk.TextPane)

Example 13 with TextPane

use of org.apache.pivot.wtk.TextPane in project pivot by apache.

the class TextPaneSkin method updateSelection.

private void updateSelection() {
    if (documentView.getCharacterCount() > 0) {
        TextPane textPane = (TextPane) getComponent();
        // Update the caret
        int selectionStart = textPane.getSelectionStart();
        Bounds leadingSelectionBounds = getCharacterBounds(selectionStart);
        // sanity check - this is where a lot of bugs show up
        if (leadingSelectionBounds == null) {
            throw new IllegalStateException("no bounds for selection " + selectionStart);
        }
        if (composedTextCaret != null) {
            caret = getCaretRectangle(composedTextCaret);
        } else {
            caret = leadingSelectionBounds.toRectangle();
        }
        caret.width = 1;
        // Update the selection
        int selectionLength = textPane.getSelectionLength();
        if (selectionLength > 0) {
            int selectionEnd = selectionStart + selectionLength - 1;
            Bounds trailingSelectionBounds = getCharacterBounds(selectionEnd);
            selection = new Area();
            int firstRowIndex = getRowAt(selectionStart);
            int lastRowIndex = getRowAt(selectionEnd);
            if (firstRowIndex == lastRowIndex) {
                selection.add(new Area(new Rectangle(leadingSelectionBounds.x, leadingSelectionBounds.y, trailingSelectionBounds.x + trailingSelectionBounds.width - leadingSelectionBounds.x, trailingSelectionBounds.y + trailingSelectionBounds.height - leadingSelectionBounds.y)));
            } else {
                int width = getWidth();
                selection.add(new Area(new Rectangle(leadingSelectionBounds.x, leadingSelectionBounds.y, width - margin.right - leadingSelectionBounds.x, leadingSelectionBounds.height)));
                if (lastRowIndex - firstRowIndex > 0) {
                    selection.add(new Area(new Rectangle(margin.left, leadingSelectionBounds.y + leadingSelectionBounds.height, width - (margin.left + margin.right), trailingSelectionBounds.y - (leadingSelectionBounds.y + leadingSelectionBounds.height))));
                }
                selection.add(new Area(new Rectangle(margin.left, trailingSelectionBounds.y, trailingSelectionBounds.x + trailingSelectionBounds.width - margin.left, trailingSelectionBounds.height)));
            }
        } else {
            selection = null;
        }
    } else {
        // Clear the caret and the selection
        caret = new Rectangle();
        selection = null;
    }
}
Also used : Area(java.awt.geom.Area) TextPane(org.apache.pivot.wtk.TextPane) Bounds(org.apache.pivot.wtk.Bounds) Rectangle(java.awt.Rectangle)

Example 14 with TextPane

use of org.apache.pivot.wtk.TextPane in project pivot by apache.

the class TextPaneSkin method keyPressed.

@Override
public boolean keyPressed(final Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
    boolean consumed = false;
    final TextPane textPane = getTextPane();
    Document document = textPane.getDocument();
    int selectionStart = textPane.getSelectionStart();
    int selectionLength = textPane.getSelectionLength();
    boolean commandPressed = Keyboard.isPressed(Platform.getCommandModifier());
    boolean wordNavPressed = Keyboard.isPressed(Platform.getWordNavigationModifier());
    boolean shiftPressed = Keyboard.isPressed(Keyboard.Modifier.SHIFT);
    boolean metaPressed = Keyboard.isPressed(Keyboard.Modifier.META);
    boolean isEditable = textPane.isEditable();
    if (document != null) {
        if (keyCode == Keyboard.KeyCode.ENTER && isEditable) {
            textPane.insertParagraph();
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.DELETE && isEditable) {
            textPane.delete(false);
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.BACKSPACE && isEditable) {
            textPane.delete(true);
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.HOME || (keyCode == Keyboard.KeyCode.LEFT && metaPressed)) {
            int start;
            if (commandPressed) {
                // Move the caret to the beginning of the text
                start = 0;
            } else {
                // Move the caret to the beginning of the line
                start = getRowOffset(document, selectionStart);
            }
            if (shiftPressed) {
                // TODO: if last direction was left, then extend further left
                // but if right, then reverse selection from the pivot point
                selectionLength += selectionStart - start;
            } else {
                selectionLength = 0;
            }
            if (start >= 0) {
                textPane.setSelection(start, selectionLength);
                scrollCharacterToVisible(start);
                consumed = true;
            }
        } else if (keyCode == Keyboard.KeyCode.END || (keyCode == Keyboard.KeyCode.RIGHT && metaPressed)) {
            int end;
            int index = selectionStart + selectionLength;
            if (commandPressed) {
                // Move the caret to end of the text
                end = textPane.getCharacterCount() - 1;
            } else {
                // Move the caret to the end of the line
                int rowOffset = getRowOffset(document, index);
                int rowLength = getRowLength(document, index);
                end = rowOffset + rowLength;
            }
            if (shiftPressed) {
                // TODO: if last direction was right, then extend further right
                // but if left, then reverse selection from the pivot point
                selectionLength += end - index;
            } else {
                selectionStart = end;
                selectionLength = 0;
            }
            if (selectionStart + selectionLength <= textPane.getCharacterCount()) {
                textPane.setSelection(selectionStart, selectionLength);
                scrollCharacterToVisible(selectionStart + selectionLength);
                consumed = true;
            }
        } else if (keyCode == Keyboard.KeyCode.LEFT) {
            if (wordNavPressed) {
                // Move the caret to the start of the next word to our left
                if (selectionStart > 0) {
                    int originalStart = selectionStart;
                    // first, skip over any space immediately to our left
                    while (selectionStart > 0 && Character.isWhitespace(document.getCharacterAt(selectionStart - 1))) {
                        selectionStart--;
                    }
                    // then, skip over any word-letters to our left
                    while (selectionStart > 0 && !Character.isWhitespace(document.getCharacterAt(selectionStart - 1))) {
                        selectionStart--;
                    }
                    if (shiftPressed) {
                        selectionLength += (originalStart - selectionStart);
                    } else {
                        selectionLength = 0;
                    }
                }
            } else if (shiftPressed) {
                // Add the previous character to the selection
                if (selectionStart > 0) {
                    selectionStart--;
                    selectionLength++;
                }
            } else {
                // Clear the selection and move the caret back by one character
                if (selectionLength == 0 && selectionStart > 0) {
                    selectionStart--;
                }
                selectionLength = 0;
            }
            textPane.setSelection(selectionStart, selectionLength);
            scrollCharacterToVisible(selectionStart);
            caretX = caret.x;
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.RIGHT) {
            if (shiftPressed) {
                // Add the next character to the selection
                if (selectionStart + selectionLength < document.getCharacterCount()) {
                    selectionLength++;
                }
                textPane.setSelection(selectionStart, selectionLength);
                scrollCharacterToVisible(selectionStart + selectionLength);
            } else if (wordNavPressed) {
                // Move the caret to the start of the next word to our right
                if (selectionStart < document.getCharacterCount()) {
                    // first, skip over any word-letters to our right
                    while (selectionStart < document.getCharacterCount() - 1 && !Character.isWhitespace(document.getCharacterAt(selectionStart))) {
                        selectionStart++;
                    }
                    // then, skip over any space immediately to our right
                    while (selectionStart < document.getCharacterCount() - 1 && Character.isWhitespace(document.getCharacterAt(selectionStart))) {
                        selectionStart++;
                    }
                    textPane.setSelection(selectionStart, 0);
                    scrollCharacterToVisible(selectionStart);
                    caretX = caret.x;
                }
            } else {
                // Clear the selection and move the caret forward by one character
                if (selectionLength > 0) {
                    selectionStart += selectionLength - 1;
                }
                if (selectionStart < document.getCharacterCount() - 1) {
                    selectionStart++;
                }
                textPane.setSelection(selectionStart, 0);
                scrollCharacterToVisible(selectionStart);
                caretX = caret.x;
            }
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.UP) {
            int offset = getNextInsertionPoint(caretX, selectionStart, TextPane.ScrollDirection.UP);
            if (offset == -1) {
                offset = 0;
            }
            if (shiftPressed) {
                selectionLength = selectionStart + selectionLength - offset;
            } else {
                selectionLength = 0;
            }
            textPane.setSelection(offset, selectionLength);
            scrollCharacterToVisible(offset);
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.DOWN) {
            if (shiftPressed) {
                int from;
                int x;
                if (selectionLength == 0) {
                    // Get next insertion point from leading selection character
                    from = selectionStart;
                    x = caretX;
                } else {
                    // Get next insertion point from right edge of trailing
                    // selection character
                    from = selectionStart + selectionLength - 1;
                    Bounds trailingSelectionBounds = getCharacterBounds(from);
                    x = trailingSelectionBounds.x + trailingSelectionBounds.width;
                }
                int offset = getNextInsertionPoint(x, from, TextPane.ScrollDirection.DOWN);
                if (offset == -1) {
                    offset = documentView.getCharacterCount() - 1;
                } else {
                    // final terminator character, increment the selection
                    if (document.getCharacterAt(offset) == '\n' && offset < documentView.getCharacterCount() - 1) {
                        offset++;
                    }
                }
                textPane.setSelection(selectionStart, offset - selectionStart);
                scrollCharacterToVisible(offset);
            } else {
                int from;
                if (selectionLength == 0) {
                    // Get next insertion point from leading selection character
                    from = selectionStart;
                } else {
                    // Get next insertion point from trailing selection character
                    from = selectionStart + selectionLength - 1;
                }
                int offset = getNextInsertionPoint(caretX, from, TextPane.ScrollDirection.DOWN);
                if (offset == -1) {
                    offset = documentView.getCharacterCount() - 1;
                }
                textPane.setSelection(offset, 0);
                scrollCharacterToVisible(offset);
            }
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.TAB && (acceptsTab != Keyboard.isPressed(Keyboard.Modifier.CTRL)) && isEditable) {
            if (textPane.getExpandTabs()) {
                int linePos = selectionStart - getRowOffset(document, selectionStart);
                StringBuilder tabBuilder = new StringBuilder(tabWidth);
                for (int i = 0; i < tabWidth - (linePos % tabWidth); i++) {
                    tabBuilder.append(" ");
                }
                textPane.insert(tabBuilder.toString());
            } else {
                textPane.insert("\t");
            }
            showCaret(true);
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.INSERT) {
            if (shiftPressed && isEditable) {
                textPane.paste();
                consumed = true;
            }
        } else if (commandPressed) {
            if (keyCode == Keyboard.KeyCode.A) {
                textPane.setSelection(0, document.getCharacterCount());
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.X && isEditable) {
                textPane.cut();
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.C) {
                textPane.copy();
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.V && isEditable) {
                textPane.paste();
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.Z && isEditable) {
                if (shiftPressed) {
                    textPane.redo();
                } else {
                    textPane.undo();
                }
                consumed = true;
            }
        } else {
            consumed = super.keyPressed(component, keyCode, keyLocation);
        }
    }
    return consumed;
}
Also used : TextPane(org.apache.pivot.wtk.TextPane) Bounds(org.apache.pivot.wtk.Bounds) Document(org.apache.pivot.wtk.text.Document)

Aggregations

TextPane (org.apache.pivot.wtk.TextPane)14 Bounds (org.apache.pivot.wtk.Bounds)5 Document (org.apache.pivot.wtk.text.Document)5 Font (java.awt.Font)2 Rectangle (java.awt.Rectangle)2 FontRenderContext (java.awt.font.FontRenderContext)2 Area (java.awt.geom.Area)2 AttributedStringCharacterIterator (org.apache.pivot.text.AttributedStringCharacterIterator)2 Span (org.apache.pivot.wtk.Span)2 Paragraph (org.apache.pivot.wtk.text.Paragraph)2 TextNode (org.apache.pivot.wtk.text.TextNode)2 TextSpan (org.apache.pivot.wtk.text.TextSpan)2 Color (java.awt.Color)1 Graphics2D (java.awt.Graphics2D)1 LineBreakMeasurer (java.awt.font.LineBreakMeasurer)1 LineMetrics (java.awt.font.LineMetrics)1 TextLayout (java.awt.font.TextLayout)1 AttributedCharacterIterator (java.text.AttributedCharacterIterator)1 CharSpan (org.apache.pivot.text.CharSpan)1 CompositeIterator (org.apache.pivot.text.CompositeIterator)1