From 765519a56275d43a59979f350c64b63f014a6ad4 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Wed, 13 May 2015 17:39:43 +0200 Subject: [PATCH] New editor: ALT+ BACKSPACE deletes next word (OSX only). See #3098 --- .../processing/app/syntax/SketchTextArea.java | 67 ++++++++++--------- .../syntax/SketchTextAreaDefaultInputMap.java | 6 ++ .../app/syntax/SketchTextAreaEditorKit.java | 65 ++++++++++++++++++ .../app/syntax/SketchTextAreaUI.java | 21 ++++++ 4 files changed, 127 insertions(+), 32 deletions(-) create mode 100644 app/src/processing/app/syntax/SketchTextAreaEditorKit.java create mode 100644 app/src/processing/app/syntax/SketchTextAreaUI.java diff --git a/app/src/processing/app/syntax/SketchTextArea.java b/app/src/processing/app/syntax/SketchTextArea.java index 78873de55..08b899916 100644 --- a/app/src/processing/app/syntax/SketchTextArea.java +++ b/app/src/processing/app/syntax/SketchTextArea.java @@ -35,8 +35,8 @@ import org.fife.ui.rsyntaxtextarea.Theme; import org.fife.ui.rsyntaxtextarea.Token; import org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip; import org.fife.ui.rtextarea.RTextArea; +import org.fife.ui.rtextarea.RTextAreaUI; import org.fife.ui.rtextarea.RUndoManager; - import processing.app.*; import javax.swing.*; @@ -47,7 +47,6 @@ import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.Segment; import javax.swing.undo.UndoManager; - import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; @@ -242,7 +241,7 @@ public class SketchTextArea extends RSyntaxTextArea { protected void configurePopupMenu(JPopupMenu popupMenu) { super.configurePopupMenu(popupMenu); } - + @Override protected RTAMouseListener createMouseListener() { return new SketchTextAreaMouseListener(this); @@ -315,8 +314,8 @@ public class SketchTextArea extends RSyntaxTextArea { return null; } } - - + + /** * Handles http hyperlinks. * NOTE (@Ricardo JL Rufino): Workaround to enable hyperlinks by default: https://github.com/bobbylight/RSyntaxTextArea/issues/119 @@ -326,12 +325,12 @@ public class SketchTextArea extends RSyntaxTextArea { private Insets insets; private boolean isScanningForLinks; private int hoveredOverLinkOffset = -1; - + protected SketchTextAreaMouseListener(RTextArea textArea) { super(textArea); insets = new Insets(0, 0, 0, 0); } - + /** * Notifies all listeners that have registered interest for notification * on this event type. The listener list is processed last to first. @@ -344,22 +343,22 @@ public class SketchTextArea extends RSyntaxTextArea { Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event - for (int i = listeners.length-2; i>=0; i-=2) { - if (listeners[i]==HyperlinkListener.class) { - ((HyperlinkListener)listeners[i+1]).hyperlinkUpdate(e); - } + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == HyperlinkListener.class) { + ((HyperlinkListener) listeners[i + 1]).hyperlinkUpdate(e); + } } } - + private HyperlinkEvent createHyperlinkEvent(MouseEvent e) { HyperlinkEvent he = null; - + Token t = viewToToken(e.getPoint()); - if (t!=null) { + if (t != null) { // Copy token, viewToModel() unfortunately modifies Token t = new TokenImpl(t); } - + if (t != null && t.isHyperlink()) { URL url = null; String desc = null; @@ -375,21 +374,21 @@ public class SketchTextArea extends RSyntaxTextArea { } he = new HyperlinkEvent(SketchTextArea.this, HyperlinkEvent.EventType.ACTIVATED, url, desc); } - + return he; } - + @Override public void mouseClicked(MouseEvent e) { if (getHyperlinksEnabled()) { HyperlinkEvent he = createHyperlinkEvent(e); - if (he!=null) { + if (he != null) { fireHyperlinkUpdate(he); } } } - - @Override + + @Override public void mouseMoved(MouseEvent e) { super.mouseMoved(e); @@ -397,16 +396,16 @@ public class SketchTextArea extends RSyntaxTextArea { if (!getHyperlinksEnabled()) { return; } - + // LinkGenerator linkGenerator = getLinkGenerator(); - + // GitHub issue RSyntaxTextArea/#25 - links identified at "edges" of editor // should not be activated if mouse is in margin insets. insets = getInsets(insets); - if (insets!=null) { + if (insets != null) { int x = e.getX(); int y = e.getY(); - if (x<=insets.left || y start) { + textArea.getDocument().remove(start, end - start); + } + } catch (BadLocationException ex) { + UIManager.getLookAndFeel().provideErrorFeedback(textArea); + } + } + + @Override + public String getMacroID() { + return rtaDeleteNextWordAction; + } + + /** + * Returns the starting offset to delete. Exists so subclasses can + * override. + */ + protected int getNextWordStart(RTextArea textArea, int end) + throws BadLocationException { + return Utilities.getNextWord(textArea, end); + } + + } + +} diff --git a/app/src/processing/app/syntax/SketchTextAreaUI.java b/app/src/processing/app/syntax/SketchTextAreaUI.java new file mode 100644 index 000000000..7ae86a102 --- /dev/null +++ b/app/src/processing/app/syntax/SketchTextAreaUI.java @@ -0,0 +1,21 @@ +package processing.app.syntax; + +import org.fife.ui.rsyntaxtextarea.RSyntaxTextAreaUI; + +import javax.swing.*; +import javax.swing.text.EditorKit; +import javax.swing.text.JTextComponent; + +public class SketchTextAreaUI extends RSyntaxTextAreaUI { + + private static final EditorKit defaultKit = new SketchTextAreaEditorKit(); + + public SketchTextAreaUI(JComponent rSyntaxTextArea) { + super(rSyntaxTextArea); + } + + @Override + public EditorKit getEditorKit(JTextComponent tc) { + return defaultKit; + } +}