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