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;
}
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;
}
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;
}
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;
}
}
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);
}
Aggregations