Search in sources :

Example 16 with TextArea

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

the class TextAreaSkin method keyPressed.

@Override
public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
    boolean consumed = false;
    if (paragraphViews.getLength() > 0) {
        TextArea textArea = (TextArea) getComponent();
        boolean commandPressed = Keyboard.isPressed(Platform.getCommandModifier());
        boolean wordNavPressed = Keyboard.isPressed(Platform.getWordNavigationModifier());
        boolean shiftPressed = Keyboard.isPressed(Keyboard.Modifier.SHIFT);
        boolean ctrlPressed = Keyboard.isPressed(Keyboard.Modifier.CTRL);
        boolean metaPressed = Keyboard.isPressed(Keyboard.Modifier.META);
        boolean isEditable = textArea.isEditable();
        if (keyCode == Keyboard.KeyCode.ENTER && acceptsEnter && isEditable && Keyboard.getModifiers() == 0) {
            int index = textArea.getSelectionStart();
            textArea.removeText(index, textArea.getSelectionLength());
            textArea.insertText("\n", index);
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.DELETE && isEditable) {
            int index = textArea.getSelectionStart();
            if (index < textArea.getCharacterCount()) {
                int count = Math.max(textArea.getSelectionLength(), 1);
                textArea.removeText(index, count);
                anchor = -1;
                consumed = true;
            }
        } else if (keyCode == Keyboard.KeyCode.BACKSPACE && isEditable) {
            int index = textArea.getSelectionStart();
            int count = textArea.getSelectionLength();
            if (count == 0 && index > 0) {
                textArea.removeText(index - 1, 1);
                consumed = true;
            } else {
                textArea.removeText(index, count);
                consumed = true;
            }
            anchor = -1;
        } else if (keyCode == Keyboard.KeyCode.TAB && (acceptsTab != ctrlPressed) && isEditable) {
            int selectionStart = textArea.getSelectionStart();
            int selectionLength = textArea.getSelectionLength();
            int rowOffset = textArea.getRowOffset(selectionStart);
            int linePos = selectionStart - rowOffset;
            StringBuilder tabBuilder = new StringBuilder(tabWidth);
            for (int i = 0; i < tabWidth - (linePos % tabWidth); i++) {
                tabBuilder.append(" ");
            }
            if (textArea.getCharacterCount() - selectionLength + tabWidth > textArea.getMaximumLength()) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                textArea.removeText(selectionStart, selectionLength);
                textArea.insertText(tabBuilder, selectionStart);
            }
            showCaret(true);
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.HOME || (keyCode == Keyboard.KeyCode.LEFT && metaPressed)) {
            int start;
            int selectionStart = textArea.getSelectionStart();
            int selectionLength = textArea.getSelectionLength();
            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(selectionStart);
            }
            if (shiftPressed) {
                selectionLength += selectionStart - start;
            } else {
                selectionLength = 0;
            }
            if (selectionStart >= 0) {
                textArea.setSelection(start, selectionLength);
                scrollCharacterToVisible(start);
                caretX = caret.x;
                consumed = true;
            }
        } else if (keyCode == Keyboard.KeyCode.END || (keyCode == Keyboard.KeyCode.RIGHT && metaPressed)) {
            int end;
            int selectionStart = textArea.getSelectionStart();
            int selectionLength = textArea.getSelectionLength();
            int index = selectionStart + selectionLength;
            if (commandPressed) {
                // Move the caret to end of the text
                end = textArea.getCharacterCount();
            } else {
                // Move the caret to the end of the line
                int rowOffset = getRowOffset(index);
                int rowLength = getRowLength(index);
                end = rowOffset + rowLength;
            }
            if (shiftPressed) {
                selectionLength += end - index;
            } else {
                selectionStart = end;
                if (selectionStart < textArea.getCharacterCount() && textArea.getCharacterAt(selectionStart) != '\n') {
                    selectionStart--;
                }
                selectionLength = 0;
            }
            if (selectionStart + selectionLength <= textArea.getCharacterCount()) {
                textArea.setSelection(selectionStart, selectionLength);
                scrollCharacterToVisible(selectionStart + selectionLength);
                caretX = caret.x;
                if (selection != null) {
                    caretX += selection.getBounds2D().getWidth();
                }
                consumed = true;
            }
        } else if (keyCode == Keyboard.KeyCode.LEFT) {
            int selectionStart = textArea.getSelectionStart();
            int selectionLength = textArea.getSelectionLength();
            if (wordNavPressed) {
                // Move the caret to the start of the next word to the left
                if (selectionStart > 0) {
                    // Skip over any space immediately to the left
                    int index = selectionStart;
                    while (index > 0 && Character.isWhitespace(textArea.getCharacterAt(index - 1))) {
                        index--;
                    }
                    // Skip over any word-letters to the left
                    while (index > 0 && !Character.isWhitespace(textArea.getCharacterAt(index - 1))) {
                        index--;
                    }
                    if (shiftPressed) {
                        selectionLength += selectionStart - index;
                    } else {
                        selectionLength = 0;
                    }
                    selectionStart = index;
                }
            } else if (shiftPressed) {
                if (anchor != -1) {
                    if (selectionStart < anchor) {
                        if (selectionStart > 0) {
                            selectionStart--;
                            selectionLength++;
                        }
                    } else {
                        if (selectionLength > 0) {
                            selectionLength--;
                        } else {
                            selectionStart--;
                            selectionLength++;
                        }
                    }
                } else {
                    // Add the previous character to the selection
                    anchor = selectionStart;
                    if (selectionStart > 0) {
                        selectionStart--;
                        selectionLength++;
                    }
                }
            } else {
                // Move the caret back by one character
                if (selectionLength == 0 && selectionStart > 0) {
                    selectionStart--;
                }
                // Clear the selection
                anchor = -1;
                selectionLength = 0;
            }
            if (selectionStart >= 0) {
                textArea.setSelection(selectionStart, selectionLength);
                scrollCharacterToVisible(selectionStart);
                caretX = caret.x;
                consumed = true;
            }
        } else if (keyCode == Keyboard.KeyCode.RIGHT) {
            int selectionStart = textArea.getSelectionStart();
            int selectionLength = textArea.getSelectionLength();
            if (wordNavPressed) {
                // Move the caret to the start of the next word to the right
                if (selectionStart < textArea.getCharacterCount()) {
                    int index = selectionStart + selectionLength;
                    // Skip over any space immediately to the right
                    while (index < textArea.getCharacterCount() && Character.isWhitespace(textArea.getCharacterAt(index))) {
                        index++;
                    }
                    // Skip over any word-letters to the right
                    while (index < textArea.getCharacterCount() && !Character.isWhitespace(textArea.getCharacterAt(index))) {
                        index++;
                    }
                    if (shiftPressed) {
                        selectionLength = index - selectionStart;
                    } else {
                        selectionStart = index;
                        selectionLength = 0;
                    }
                }
            } else if (shiftPressed) {
                if (anchor != -1) {
                    if (selectionStart < anchor) {
                        selectionStart++;
                        selectionLength--;
                    } else {
                        selectionLength++;
                    }
                } else {
                    // Add the next character to the selection
                    anchor = selectionStart;
                    selectionLength++;
                }
            } else {
                // Move the caret forward by one character
                if (selectionLength == 0) {
                    selectionStart++;
                } else {
                    selectionStart += selectionLength;
                }
                // Clear the selection
                anchor = -1;
                selectionLength = 0;
            }
            if (selectionStart + selectionLength <= textArea.getCharacterCount()) {
                textArea.setSelection(selectionStart, selectionLength);
                scrollCharacterToVisible(selectionStart + selectionLength);
                caretX = caret.x;
                if (selection != null) {
                    caretX += selection.getBounds2D().getWidth();
                }
                consumed = true;
            }
        } else if (keyCode == Keyboard.KeyCode.UP) {
            int selectionStart = textArea.getSelectionStart();
            int selectionLength = textArea.getSelectionLength();
            int index = -1;
            if (shiftPressed) {
                if (anchor == -1) {
                    anchor = selectionStart;
                    index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.UP);
                    if (index != -1) {
                        selectionLength = selectionStart - index;
                    }
                } else {
                    if (selectionStart < anchor) {
                        // continue upwards
                        index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.UP);
                        if (index != -1) {
                            selectionLength = selectionStart + selectionLength - index;
                        }
                    } else {
                        // reduce downward size
                        Bounds trailingSelectionBounds = getCharacterBounds(selectionStart + selectionLength - 1);
                        int x = trailingSelectionBounds.x + trailingSelectionBounds.width;
                        index = getNextInsertionPoint(x, selectionStart + selectionLength - 1, TextArea.ScrollDirection.UP);
                        if (index != -1) {
                            if (index < anchor) {
                                selectionLength = anchor - index;
                            } else {
                                selectionLength = index - selectionStart;
                                index = selectionStart;
                            }
                        }
                    }
                }
            } else {
                index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.UP);
                if (index != -1) {
                    selectionLength = 0;
                }
                anchor = -1;
            }
            if (index != -1) {
                textArea.setSelection(index, selectionLength);
                scrollCharacterToVisible(index);
                caretX = caret.x;
            }
            consumed = true;
        } else if (keyCode == Keyboard.KeyCode.DOWN) {
            int selectionStart = textArea.getSelectionStart();
            int selectionLength = textArea.getSelectionLength();
            if (shiftPressed) {
                int from;
                int x;
                int index;
                if (anchor == -1) {
                    anchor = selectionStart;
                    index = getNextInsertionPoint(caretX, selectionStart, TextArea.ScrollDirection.DOWN);
                    if (index != -1) {
                        selectionLength = index - selectionStart;
                    }
                } else {
                    if (selectionStart < anchor) {
                        // Reducing upward size
                        // Get next insertion point from leading selection
                        // character
                        from = selectionStart;
                        x = caretX;
                        index = getNextInsertionPoint(x, from, TextArea.ScrollDirection.DOWN);
                        if (index != -1) {
                            if (index < anchor) {
                                selectionStart = index;
                                selectionLength = anchor - index;
                            } else {
                                selectionStart = anchor;
                                selectionLength = index - anchor;
                            }
                            textArea.setSelection(selectionStart, selectionLength);
                            scrollCharacterToVisible(selectionStart);
                        }
                    } else {
                        // Increasing downward size
                        // Get next insertion point from right edge of
                        // trailing selection
                        // character
                        from = selectionStart + selectionLength - 1;
                        Bounds trailingSelectionBounds = getCharacterBounds(from);
                        x = trailingSelectionBounds.x + trailingSelectionBounds.width;
                        index = getNextInsertionPoint(x, from, TextArea.ScrollDirection.DOWN);
                        if (index != -1) {
                            // the selection
                            if (index < textArea.getCharacterCount() - 1 && textArea.getCharacterAt(index) == '\n') {
                                index++;
                            }
                            textArea.setSelection(selectionStart, index - selectionStart);
                            scrollCharacterToVisible(index);
                        }
                    }
                }
            } 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 index = getNextInsertionPoint(caretX, from, TextArea.ScrollDirection.DOWN);
                if (index != -1) {
                    textArea.setSelection(index, 0);
                    scrollCharacterToVisible(index);
                    caretX = caret.x;
                }
                anchor = -1;
            }
            consumed = true;
        } else if (commandPressed) {
            if (keyCode == Keyboard.KeyCode.A) {
                textArea.setSelection(0, textArea.getCharacterCount());
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.X && isEditable) {
                textArea.cut();
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.C) {
                textArea.copy();
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.V && isEditable) {
                textArea.paste();
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.Z && isEditable) {
                if (!shiftPressed) {
                    textArea.undo();
                }
                consumed = true;
            } else if (keyCode == Keyboard.KeyCode.TAB) {
                // Only here if acceptsTab is false
                consumed = super.keyPressed(component, keyCode, keyLocation);
            }
        } else if (keyCode == Keyboard.KeyCode.INSERT) {
            if (shiftPressed && isEditable) {
                textArea.paste();
                consumed = true;
            }
        } else {
            consumed = super.keyPressed(component, keyCode, keyLocation);
        }
    }
    return consumed;
}
Also used : TextArea(org.apache.pivot.wtk.TextArea) Bounds(org.apache.pivot.wtk.Bounds)

Example 17 with TextArea

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

the class TextAreaSkin method mouseClick.

@Override
public boolean mouseClick(Component component, Mouse.Button button, int x, int y, int count) {
    boolean consumed = super.mouseClick(component, button, x, y, count);
    TextArea textArea = (TextArea) component;
    if (button == Mouse.Button.LEFT) {
        int index = getInsertionPoint(x, y);
        if (index != -1) {
            if (count == 2) {
                CharSpan charSpan = CharUtils.selectWord(textArea.getRowCharacters(index), index);
                if (charSpan != null) {
                    textArea.setSelection(charSpan);
                }
            } else if (count == 3) {
                textArea.setSelection(textArea.getRowOffset(index), textArea.getRowLength(index));
            }
        }
    }
    return consumed;
}
Also used : TextArea(org.apache.pivot.wtk.TextArea) CharSpan(org.apache.pivot.text.CharSpan)

Example 18 with TextArea

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

the class TextAreaSkin method getRowLength.

@Override
public int getRowLength(int index) {
    int rowLength = -1;
    if (paragraphViews.getLength() > 0) {
        TextArea textArea = (TextArea) getComponent();
        TextAreaSkinParagraphView paragraphView = paragraphViews.get(textArea.getParagraphAt(index));
        rowLength = paragraphView.getRowLength(index - paragraphView.getParagraph().getOffset());
    }
    return rowLength;
}
Also used : TextArea(org.apache.pivot.wtk.TextArea)

Example 19 with TextArea

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

the class TextAreaSkin method updateSelection.

private void updateSelection() {
    TextArea textArea = (TextArea) getComponent();
    if (paragraphViews.getLength() > 0) {
        // Update the caret
        int selectionStart = textArea.getSelectionStart();
        Bounds leadingSelectionBounds = getCharacterBounds(selectionStart);
        caret = leadingSelectionBounds.toRectangle();
        caret.width = 1;
        // Update the selection
        int selectionLength = textArea.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.getWidth(), 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) TextArea(org.apache.pivot.wtk.TextArea) TextArea(org.apache.pivot.wtk.TextArea) Bounds(org.apache.pivot.wtk.Bounds) Rectangle(java.awt.Rectangle)

Example 20 with TextArea

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

the class TextAreaSkin method install.

@Override
public void install(Component component) {
    super.install(component);
    Theme theme = currentTheme();
    theme.setDefaultStyles(this);
    TextArea textArea = (TextArea) component;
    textArea.getTextAreaListeners().add(this);
    textArea.getTextAreaContentListeners().add(this);
    textArea.getTextAreaSelectionListeners().add(this);
    textArea.setCursor(Cursor.TEXT);
}
Also used : TextArea(org.apache.pivot.wtk.TextArea) Theme(org.apache.pivot.wtk.Theme)

Aggregations

TextArea (org.apache.pivot.wtk.TextArea)22 Bounds (org.apache.pivot.wtk.Bounds)5 BXMLSerializer (org.apache.pivot.beans.BXMLSerializer)3 Span (org.apache.pivot.wtk.Span)3 Area (java.awt.geom.Area)2 IOException (java.io.IOException)2 ArrayList (org.apache.pivot.collections.ArrayList)2 List (org.apache.pivot.collections.List)2 Sequence (org.apache.pivot.collections.Sequence)2 SerializationException (org.apache.pivot.serialization.SerializationException)2 Button (org.apache.pivot.wtk.Button)2 ButtonPressListener (org.apache.pivot.wtk.ButtonPressListener)2 Component (org.apache.pivot.wtk.Component)2 ComponentKeyListener (org.apache.pivot.wtk.ComponentKeyListener)2 ComponentMouseButtonListener (org.apache.pivot.wtk.ComponentMouseButtonListener)2 ComponentTooltipListener (org.apache.pivot.wtk.ComponentTooltipListener)2 Container (org.apache.pivot.wtk.Container)2 Display (org.apache.pivot.wtk.Display)2 FocusTraversalDirection (org.apache.pivot.wtk.FocusTraversalDirection)2 Keyboard (org.apache.pivot.wtk.Keyboard)2