diff --git a/actions.xml b/actions.xml
index e0abe1e2bb..ee174c35d5 100644
--- a/actions.xml
+++ b/actions.xml
@@ -49,7 +49,7 @@
- FactorPlugin.factorWordOutputOp(view,"see");
+ WordPopup.showWordPopup(textArea);
diff --git a/factor/jedit/FactorPlugin.java b/factor/jedit/FactorPlugin.java
index bc9bb9c6d2..f3c4d693ac 100644
--- a/factor/jedit/FactorPlugin.java
+++ b/factor/jedit/FactorPlugin.java
@@ -299,6 +299,26 @@ public class FactorPlugin extends EditPlugin
}
} //}}}
+ //{{{ getWordStartIndex() method
+ public static int getWordStartOffset(String line, int caret)
+ {
+ ReadTable readtable = ReadTable.DEFAULT_READTABLE;
+
+ int start = caret;
+ while(start > 0)
+ {
+ if(readtable.getCharacterType(line.charAt(start - 1))
+ == ReadTable.WHITESPACE)
+ {
+ break;
+ }
+ else
+ start--;
+ }
+
+ return start;
+ } //}}}
+
//{{{ getWordAtCaret() method
public static String getWordAtCaret(JEditTextArea textArea)
{
@@ -323,17 +343,7 @@ public class FactorPlugin extends EditPlugin
return null;
}
- int start = caret;
- while(start > 0)
- {
- if(readtable.getCharacterType(line.charAt(start - 1))
- == ReadTable.WHITESPACE)
- {
- break;
- }
- else
- start--;
- }
+ int start = getWordStartOffset(line,caret);
int end = caret;
do
diff --git a/factor/jedit/WordPopup.java b/factor/jedit/WordPopup.java
new file mode 100644
index 0000000000..7540359181
--- /dev/null
+++ b/factor/jedit/WordPopup.java
@@ -0,0 +1,114 @@
+/* :folding=explicit:collapseFolds=1: */
+
+/*
+ * $Id$
+ *
+ * Copyright (C) 2004 Slava Pestov.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package factor.jedit;
+
+import factor.*;
+import java.awt.event.*;
+import java.awt.*;
+import java.io.IOException;
+import javax.swing.*;
+import org.gjt.sp.jedit.textarea.JEditTextArea;
+import org.gjt.sp.jedit.*;
+import org.gjt.sp.util.Log;
+
+public class WordPopup extends JWindow
+{
+ private View view;
+ private JTextArea preview;
+
+ //{{{ showWordPopup() method
+ public static void showWordPopup(JEditTextArea textArea)
+ {
+ View view = GUIUtilities.getView(textArea);
+ String def;
+
+ try
+ {
+ def = FactorPlugin.evalInWire(
+ FactorPlugin.factorWord(view)
+ + " see").trim();
+ }
+ catch(IOException io)
+ {
+ def = io.toString();
+ Log.log(Log.ERROR,WordPopup.class,io);
+ }
+
+ WordPopup popup = new WordPopup(view,def);
+
+ int line = textArea.getCaretLine();
+ String lineText = textArea.getLineText(line);
+ int caret = textArea.getCaretPosition()
+ - textArea.getLineStartOffset(line);
+ int start = FactorPlugin.getWordStartOffset(lineText,caret);
+ Point loc = textArea.offsetToXY(line,start);
+ loc.y += textArea.getPainter().getFontMetrics().getHeight();
+ SwingUtilities.convertPointToScreen(loc,textArea.getPainter());
+ popup.setLocation(loc);
+ popup.show();
+ } //}}}
+
+ //{{{ WordPopup constructor
+ public WordPopup(View view, String text)
+ {
+ super(view);
+ this.view = view;
+ preview = new JTextArea(text);
+ preview.setEditable(false);
+ getContentPane().add(BorderLayout.CENTER,new JScrollPane(preview));
+ pack();
+
+ KeyHandler keyHandler = new KeyHandler();
+ addKeyListener(keyHandler);
+ preview.addKeyListener(keyHandler);
+ view.setKeyEventInterceptor(keyHandler);
+
+ GUIUtilities.requestFocus(this,preview);
+ } //}}}
+
+ //{{{ KeyHandler class
+ class KeyHandler extends KeyAdapter
+ {
+ //{{{ keyPressed() method
+ public void keyPressed(KeyEvent evt)
+ {
+ switch(evt.getKeyCode())
+ {
+ case KeyEvent.VK_TAB:
+ case KeyEvent.VK_ENTER:
+ case KeyEvent.VK_ESCAPE:
+ dispose();
+ view.setKeyEventInterceptor(null);
+ evt.consume();
+ break;
+ }
+ } //}}}
+ } //}}}
+}