From 19c26db5fe26d5930261977205512a3ed198d948 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Sat, 8 Jul 2017 23:02:36 -0700 Subject: [PATCH 1/2] Rename StyledTextAreaBehavior to GenericStyledAreaBehavior --- .../fxmisc/richtext/GenericStyledArea.java | 2 +- ...or.java => GenericStyledAreaBehavior.java} | 72 +++++++++---------- 2 files changed, 37 insertions(+), 37 deletions(-) rename richtextfx/src/main/java/org/fxmisc/richtext/{StyledTextAreaBehavior.java => GenericStyledAreaBehavior.java} (87%) diff --git a/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java b/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java index 402122332..2d2009d14 100644 --- a/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java +++ b/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java @@ -688,7 +688,7 @@ public GenericStyledArea( : EventStreams.never()) .subscribe(evt -> Event.fireEvent(this, evt)); - new StyledTextAreaBehavior(this); + new GenericStyledAreaBehavior(this); } /* ********************************************************************** * diff --git a/richtextfx/src/main/java/org/fxmisc/richtext/StyledTextAreaBehavior.java b/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledAreaBehavior.java similarity index 87% rename from richtextfx/src/main/java/org/fxmisc/richtext/StyledTextAreaBehavior.java rename to richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledAreaBehavior.java index 928e9b39c..a16dc6af6 100644 --- a/richtextfx/src/main/java/org/fxmisc/richtext/StyledTextAreaBehavior.java +++ b/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledAreaBehavior.java @@ -32,7 +32,7 @@ /** * Controller for GenericStyledArea. */ -class StyledTextAreaBehavior { +class GenericStyledAreaBehavior { private static final boolean isMac; private static final boolean isWindows; @@ -42,19 +42,19 @@ class StyledTextAreaBehavior { isWindows = os.startsWith("Windows"); } - private static final InputMapTemplate EVENT_TEMPLATE; + private static final InputMapTemplate EVENT_TEMPLATE; static { SelectionPolicy selPolicy = isMac ? SelectionPolicy.EXTEND : SelectionPolicy.ADJUST; - InputMapTemplate editsBase = sequence( + InputMapTemplate editsBase = sequence( // deletion - consume(keyPressed(DELETE), StyledTextAreaBehavior::deleteForward), - consume(keyPressed(BACK_SPACE), StyledTextAreaBehavior::deleteBackward), - consume(keyPressed(DELETE, SHORTCUT_DOWN), StyledTextAreaBehavior::deleteNextWord), - consume(keyPressed(BACK_SPACE, SHORTCUT_DOWN), StyledTextAreaBehavior::deletePrevWord), + consume(keyPressed(DELETE), GenericStyledAreaBehavior::deleteForward), + consume(keyPressed(BACK_SPACE), GenericStyledAreaBehavior::deleteBackward), + consume(keyPressed(DELETE, SHORTCUT_DOWN), GenericStyledAreaBehavior::deleteNextWord), + consume(keyPressed(BACK_SPACE, SHORTCUT_DOWN), GenericStyledAreaBehavior::deletePrevWord), // cut consume( anyOf(keyPressed(CUT), keyPressed(X, SHORTCUT_DOWN), keyPressed(DELETE, SHIFT_DOWN)), @@ -72,9 +72,9 @@ class StyledTextAreaBehavior { anyOf(keyPressed(Y, SHORTCUT_DOWN), keyPressed(Z, SHORTCUT_DOWN, SHIFT_DOWN)), (b, e) -> b.view.redo()) ); - InputMapTemplate edits = when(b -> b.view.isEditable(), editsBase); + InputMapTemplate edits = when(b -> b.view.isEditable(), editsBase); - InputMapTemplate verticalNavigation = sequence( + InputMapTemplate verticalNavigation = sequence( // vertical caret movement consume( anyOf(keyPressed(UP), keyPressed(KP_UP)), @@ -95,10 +95,10 @@ class StyledTextAreaBehavior { consume(keyPressed(PAGE_DOWN, SHIFT_DOWN), (b, e) -> b.view.nextPage(SelectionPolicy.ADJUST)) ); - InputMapTemplate otherNavigation = sequence( + InputMapTemplate otherNavigation = sequence( // caret movement - consume(anyOf(keyPressed(RIGHT), keyPressed(KP_RIGHT)), StyledTextAreaBehavior::right), - consume(anyOf(keyPressed(LEFT), keyPressed(KP_LEFT)), StyledTextAreaBehavior::left), + consume(anyOf(keyPressed(RIGHT), keyPressed(KP_RIGHT)), GenericStyledAreaBehavior::right), + consume(anyOf(keyPressed(LEFT), keyPressed(KP_LEFT)), GenericStyledAreaBehavior::left), consume(keyPressed(HOME), (b, e) -> b.view.lineStart(SelectionPolicy.CLEAR)), consume(keyPressed(END), (b, e) -> b.view.lineEnd(SelectionPolicy.CLEAR)), consume( @@ -118,12 +118,12 @@ class StyledTextAreaBehavior { anyOf( keyPressed(RIGHT, SHIFT_DOWN), keyPressed(KP_RIGHT, SHIFT_DOWN) - ), StyledTextAreaBehavior::selectRight), + ), GenericStyledAreaBehavior::selectRight), consume( anyOf( keyPressed(LEFT, SHIFT_DOWN), keyPressed(KP_LEFT, SHIFT_DOWN) - ), StyledTextAreaBehavior::selectLeft), + ), GenericStyledAreaBehavior::selectLeft), consume(keyPressed(HOME, SHIFT_DOWN), (b, e) -> b.view.lineStart(selPolicy)), consume(keyPressed(END, SHIFT_DOWN), (b, e) -> b.view.lineEnd(selPolicy)), consume(keyPressed(HOME, SHIFT_DOWN, SHORTCUT_DOWN), (b, e) -> b.view.start(selPolicy)), @@ -141,7 +141,7 @@ class StyledTextAreaBehavior { consume(keyPressed(A, SHORTCUT_DOWN), (b, e) -> b.view.selectAll()) ); - InputMapTemplate copyAction = consume( + InputMapTemplate copyAction = consume( anyOf( keyPressed(COPY), keyPressed(C, SHORTCUT_DOWN), @@ -160,9 +160,9 @@ class StyledTextAreaBehavior { e.getCode().isDigitKey() || e.getCode().isWhitespaceKey(); - InputMapTemplate charPressConsumer = consume(keyPressed().onlyIf(isChar.and(noControlKeys))); + InputMapTemplate charPressConsumer = consume(keyPressed().onlyIf(isChar.and(noControlKeys))); - InputMapTemplate keyPressedTemplate = edits + InputMapTemplate keyPressedTemplate = edits .orElse(otherNavigation).ifConsumed((b, e) -> b.view.clearTargetCaretOffset()) .orElse(verticalNavigation) .orElse(copyAction) @@ -171,14 +171,14 @@ class StyledTextAreaBehavior { // requestFollowCaret is called in keyTypedTemplate .orElse(charPressConsumer); - InputMapTemplate keyTypedBase = consume( + InputMapTemplate keyTypedBase = consume( // character input EventPattern.keyTyped().onlyIf(noControlKeys.and(e -> isLegal(e.getCharacter()))), - StyledTextAreaBehavior::keyTyped + GenericStyledAreaBehavior::keyTyped ).ifConsumed((b, e) -> b.view.requestFollowCaret()); - InputMapTemplate keyTypedTemplate = when(b -> b.view.isEditable(), keyTypedBase); + InputMapTemplate keyTypedTemplate = when(b -> b.view.isEditable(), keyTypedBase); - InputMapTemplate mousePressedTemplate = sequence( + InputMapTemplate mousePressedTemplate = sequence( // ignore mouse pressed events if the view is disabled process(mousePressed(MouseButton.PRIMARY), (b, e) -> b.view.isDisabled() ? Result.IGNORE : Result.PROCEED), @@ -191,44 +191,44 @@ class StyledTextAreaBehavior { ), consume( mousePressed(MouseButton.PRIMARY).onlyIf(MouseEvent::isShiftDown), - StyledTextAreaBehavior::handleShiftPress + GenericStyledAreaBehavior::handleShiftPress ), consume( mousePressed(MouseButton.PRIMARY).onlyIf(e -> e.getClickCount() == 1), - StyledTextAreaBehavior::handleFirstPrimaryPress + GenericStyledAreaBehavior::handleFirstPrimaryPress ), consume( mousePressed(MouseButton.PRIMARY).onlyIf(e -> e.getClickCount() == 2), - StyledTextAreaBehavior::handleSecondPress + GenericStyledAreaBehavior::handleSecondPress ), consume( mousePressed(MouseButton.PRIMARY).onlyIf(e -> e.getClickCount() == 3), - StyledTextAreaBehavior::handleThirdPress + GenericStyledAreaBehavior::handleThirdPress ) ); Predicate primaryOnlyButton = e -> e.getButton() == MouseButton.PRIMARY && !e.isMiddleButtonDown() && !e.isSecondaryButtonDown(); - InputMapTemplate mouseDragDetectedTemplate = consume( + InputMapTemplate mouseDragDetectedTemplate = consume( eventType(MouseEvent.DRAG_DETECTED).onlyIf(primaryOnlyButton), (b, e) -> b.handlePrimaryOnlyDragDetected() ); - InputMapTemplate mouseDragTemplate = sequence( + InputMapTemplate mouseDragTemplate = sequence( process( mouseDragged().onlyIf(primaryOnlyButton), - StyledTextAreaBehavior::processPrimaryOnlyMouseDragged + GenericStyledAreaBehavior::processPrimaryOnlyMouseDragged ), consume( mouseDragged(), - StyledTextAreaBehavior::continueOrStopAutoScroll + GenericStyledAreaBehavior::continueOrStopAutoScroll ) ); - InputMapTemplate mouseReleasedTemplate = sequence( + InputMapTemplate mouseReleasedTemplate = sequence( process( EventPattern.mouseReleased().onlyIf(primaryOnlyButton), - StyledTextAreaBehavior::processMouseReleased + GenericStyledAreaBehavior::processMouseReleased ), consume( mouseReleased(), @@ -236,14 +236,14 @@ class StyledTextAreaBehavior { ) ); - InputMapTemplate mouseTemplate = sequence( + InputMapTemplate mouseTemplate = sequence( mousePressedTemplate, mouseDragDetectedTemplate, mouseDragTemplate, mouseReleasedTemplate ); - InputMapTemplate contextMenuEventTemplate = consumeWhen( + InputMapTemplate contextMenuEventTemplate = consumeWhen( EventPattern.eventType(ContextMenuEvent.CONTEXT_MENU_REQUESTED), b -> !b.view.isDisabled() && b.view.isContextMenuPresent(), - StyledTextAreaBehavior::showContextMenu + GenericStyledAreaBehavior::showContextMenu ); EVENT_TEMPLATE = sequence(mouseTemplate, keyPressedTemplate, keyTypedTemplate, contextMenuEventTemplate); @@ -280,7 +280,7 @@ private enum DragState { * Constructors * * ********************************************************************** */ - StyledTextAreaBehavior(GenericStyledArea area) { + GenericStyledAreaBehavior(GenericStyledArea area) { this.view = area; InputMapTemplate.installFallback(EVENT_TEMPLATE, this, b -> b.view); @@ -289,7 +289,7 @@ private enum DragState { Val projection = Val.combine( autoscrollTo, area.layoutBoundsProperty(), - StyledTextAreaBehavior::project); + GenericStyledAreaBehavior::project); Val distance = Val.combine( autoscrollTo, projection, From d3c6ea4dc5243cf5599600d460fbf59c6bd899f2 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Sat, 8 Jul 2017 23:04:08 -0700 Subject: [PATCH 2/2] Simplify code --- .../org/fxmisc/richtext/model/EditableStyledDocument.java | 4 ++-- .../main/java/org/fxmisc/richtext/model/RichTextChange.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/richtextfx/src/main/java/org/fxmisc/richtext/model/EditableStyledDocument.java b/richtextfx/src/main/java/org/fxmisc/richtext/model/EditableStyledDocument.java index 55f1a8edd..a0ec36eb7 100644 --- a/richtextfx/src/main/java/org/fxmisc/richtext/model/EditableStyledDocument.java +++ b/richtextfx/src/main/java/org/fxmisc/richtext/model/EditableStyledDocument.java @@ -45,9 +45,9 @@ public interface EditableStyledDocument extends StyledDocument plainChanges() { return richChanges() - .map(c -> new PlainTextChange(c.position, c.removed.getText(), c.inserted.getText())) + .map(RichTextChange::toPlainTextChange) // filter out rich changes where the style was changed but text wasn't added/removed - .filter(pc -> !pc.removed.equals(pc.inserted)); + .filter(pc -> !pc.isIdentity()); } EventStream> richChanges(); diff --git a/richtextfx/src/main/java/org/fxmisc/richtext/model/RichTextChange.java b/richtextfx/src/main/java/org/fxmisc/richtext/model/RichTextChange.java index 8db5e0a2c..57645a362 100644 --- a/richtextfx/src/main/java/org/fxmisc/richtext/model/RichTextChange.java +++ b/richtextfx/src/main/java/org/fxmisc/richtext/model/RichTextChange.java @@ -30,4 +30,8 @@ protected final StyledDocument sub(StyledDocument doc, i protected final RichTextChange create(int position, StyledDocument removed, StyledDocument inserted) { return new RichTextChange<>(position, removed, inserted); } + + public final PlainTextChange toPlainTextChange() { + return new PlainTextChange(position, removed.getText(), inserted.getText()); + } }