Fixed LineBreakListener to handle line breaks only after key release.
authorp.ciardelli <p.ciardelli@localhost>
Fri, 6 Feb 2009 14:59:46 +0000 (14:59 +0000)
committerp.ciardelli <p.ciardelli@localhost>
Fri, 6 Feb 2009 14:59:46 +0000 (14:59 +0000)
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/LineBreakListener.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/editor/name/NameComposite.java

index 9fb070d17e179d4ce1e2aebe1e8c7026dba8e5f8..ca1ff4dead5a92dad08e046a16e130b4d0629084 100644 (file)
@@ -9,25 +9,50 @@
 \r
 package eu.etaxonomy.taxeditor.editor;\r
 \r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
 import java.util.Scanner;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.eclipse.swt.custom.StyledText;\r
+import org.eclipse.swt.events.KeyEvent;\r
+import org.eclipse.swt.events.KeyListener;\r
 import org.eclipse.swt.events.VerifyEvent;\r
 import org.eclipse.swt.events.VerifyListener;\r
 \r
 /**\r
  * Checks text entered into a StyledText widget for line breaks, sends\r
- *  split text to abstract method handleSplitText().\r
+ * split text to abstract method handleSplitText().\r
+ *  <p>\r
+ * VerifyListener interface methods break up the text into lines. Each line is sent individually\r
+ * to the handleSplitText() method when the KeyListener interface method keyReleased() is called. \r
+ * This is because if the StyledText widget is disposed before the key is released, an SWT \r
+ * exception occurs.\r
+ * <p>\r
+ * The listener should be set on the StyledText widget as follows:\r
+ * <code><pre>\r
+ *             StyledText styledText = new SourceViewer().getTextWidget(); *                           \r
+ *             LineBreakListener lineBreakListener = new LineBreakListener() {\r
+ *                     @Override\r
+ *                     public void handleSplitText(String text) {\r
+ *                             ... some operation ...\r
+ *                     }\r
+ *             };\r
+ *             \r
+ *             styledText.addVerifyListener(lineBreakListener);\r
+ *             styledText.addKeyListener(lineBreakListener);\r
+ * </pre></code>\r
  * \r
  * @author p.ciardelli\r
  * @created 19.05.2008\r
  * @version 1.0\r
  */\r
-public abstract class LineBreakListener implements VerifyListener {\r
+public abstract class LineBreakListener implements VerifyListener, KeyListener {\r
        private static final Logger logger = Logger\r
                        .getLogger(LineBreakListener.class);\r
        \r
+       Collection<String> splitTexts;\r
+       \r
        /** \r
         * Checks for 3 conditions of name viewer text:\r
         *   1) no line breaks in text\r
@@ -48,15 +73,18 @@ public abstract class LineBreakListener implements VerifyListener {
                if (!verifyText.contains(System.getProperty("line.separator"))) {\r
                        return;\r
                }\r
-               \r
+                               \r
                // Don't add verifyText without further processing\r
                e.doit = false;\r
                \r
+               // Initialize split text collection\r
+               splitTexts = new ArrayList<String>();\r
+               \r
                // If user has entered return at the end of the line,\r
                //  make a new, empty synonym\r
                if (widgetText.length() == cursorPosition &&\r
                                verifyText.equals(System.getProperty("line.separator"))) {\r
-                       handleSplitText("");\r
+                       splitTexts.add("");\r
                        return;\r
                }\r
                \r
@@ -74,7 +102,20 @@ public abstract class LineBreakListener implements VerifyListener {
                \r
                // Start new synonyms with the rest\r
                while (scanner.hasNext()) {\r
-                       handleSplitText(scanner.next());\r
+                       splitTexts.add(scanner.next());\r
+               }\r
+       }\r
+       \r
+       @Override\r
+       public void keyPressed(KeyEvent e) {}\r
+\r
+       @Override\r
+       public void keyReleased(KeyEvent e) {\r
+               if (splitTexts != null) {\r
+                       for (String text : splitTexts) {\r
+                               handleSplitText(text);\r
+                       }\r
+                       splitTexts = null;\r
                }\r
        }\r
        \r
index 61d3954db1545520d6878001e92e5aeab5405e59..538a96951692ae1d0d27e0f0d79184ac13a5bf4e 100644 (file)
@@ -297,11 +297,8 @@ public abstract class NameComposite extends GroupedComposite {
        protected abstract TaxonNameBase getName();\r
        \r
        protected void calculateErrors() {\r
-                               \r
                nameViewer.clearErrors();\r
-               \r
                nameViewer.setShowParsingError(getName());\r
-               \r
        }\r
        \r
        private NameViewer createNameViewer() {\r
@@ -313,8 +310,7 @@ public abstract class NameComposite extends GroupedComposite {
                \r
                setTextViewer(nameViewer);\r
                                \r
-               nameViewer.addLineBreakListener(new LineBreakListener() {\r
-\r
+               LineBreakListener lineBreakListener = new LineBreakListener() {\r
                        @Override\r
                        public void handleSplitText(String text) {\r
                                \r
@@ -322,25 +318,12 @@ public abstract class NameComposite extends GroupedComposite {
                                IUndoContext undoContext = EditorController.getUndoContext(taxon);\r
                                IUndoableOperation operation = new CreateSynonymInNewGroupOperation\r
                                                ("new heterotypic synonym", undoContext, taxon, text); //$NON-NLS-1$\r
-//                             setOperation(new CreateSynonymInNewGroupOperation\r
-                               \r
                                GlobalController.executeOperation(operation);\r
-//                             getTextViewer().removeLineBreakListener(this);\r
                        }\r
-\r
-               });\r
-\r
-//             styledText.addKeyListener(new KeyAdapter(){\r
-//\r
-//                     @Override\r
-//                     public void keyReleased(KeyEvent e) {\r
-//                             if (operation != null) {\r
-//                                     GlobalController.executeOperation(operation);\r
-//                                     operation = null;\r
-//                             }\r
-//                     }\r
-//                     \r
-//             });\r
+               };\r
+               \r
+               styledText.addVerifyListener(lineBreakListener);\r
+               styledText.addKeyListener(lineBreakListener);\r
                \r
                styledText.addFocusListener(new FocusAdapter() {\r
                        public void focusGained(FocusEvent e) {\r
@@ -349,18 +332,11 @@ public abstract class NameComposite extends GroupedComposite {
                });\r
                \r
                // createLineWrapSupport(nameViewer);\r
-                       \r
                \r
                return nameViewer;\r
        }\r
-       \r
-//     IUndoableOperation operation;\r
 \r
        private Label nonEditableInfo;\r
-       \r
-//     protected void setOperation(IUndoableOperation operation) {\r
-//             this.operation = operation;\r
-//     }\r
 \r
        public void setText(String text) {\r
                Assert.isNotNull(getTextViewer(), \r