Improve HelpOnKeywordAction in right click
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / actions / HelpOnKeywordAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Bruno JOFRET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.scinotes.actions;
14
15 import java.beans.PropertyChangeEvent;
16 import java.beans.PropertyChangeListener;
17 import java.util.StringTokenizer;
18
19 import javax.swing.JMenuItem;
20 import javax.swing.KeyStroke;
21 import javax.swing.text.BadLocationException;
22
23 import org.scilab.modules.gui.menuitem.MenuItem;
24 import org.scilab.modules.scinotes.SciNotes;
25 import org.scilab.modules.scinotes.ScilabLexerConstants;
26 import org.scilab.modules.scinotes.ScilabEditorPane;
27 import org.scilab.modules.scinotes.KeywordEvent;
28 import org.scilab.modules.scinotes.utils.SciNotesMessages;
29 import org.scilab.modules.action_binding.InterpreterManagement;
30
31 /**
32  * HelpOnKeywordAction Class
33  * @author Calixte DENIZET
34  */
35 public class HelpOnKeywordAction extends DefaultAction {
36
37     protected boolean isPopup;
38
39     /**
40      * Constructor
41      * @param name the name of the action
42      * @param editor SciNotes
43      */
44     public HelpOnKeywordAction(String name, SciNotes editor) {
45         super(name, editor);
46     }
47
48     /**
49      * doAction
50      */
51     public void doAction() {
52         String selection = "";
53         int start = getEditor().getTextPane().getSelectionStart();
54         int end = getEditor().getTextPane().getSelectionEnd();
55         try {
56             if (start == end) {
57                 KeywordEvent kwe = ((ScilabEditorPane) getEditor().getTextPane()).getKeywordEvent(!isPopup, true);
58                 if (ScilabLexerConstants.isHelpable(kwe.getType())) {
59                     selection = getEditor().getTextPane().getDocument().getText(kwe.getStart(), kwe.getLength());
60                 }
61             } else {
62                 selection = getEditor().getTextPane().getDocument().getText(start, end - start);
63             }
64         } catch (BadLocationException e) { }
65
66         InterpreterManagement.requestScilabExec("help('" + selection + "')");
67     }
68
69     /**
70      * createMenu
71      * @param label label of the menu
72      * @param editor SciNotes
73      * @param key KeyStroke
74      * @return MenuItem
75      */
76     public static MenuItem createMenu(String label, final SciNotes editor, KeyStroke key) {
77         StringTokenizer token = new StringTokenizer(label, ";");
78         final String label1 = token.nextToken();
79         final String label2 = token.nextToken();
80         return createMenu(label1, label2, editor, key, new HelpOnKeywordAction(label1 + SciNotesMessages.DOTS, editor));
81     }
82
83     /**
84      * createMenu
85      * @param label label of the menu
86      * @param editor SciNotes
87      * @param key Keystroke
88      * @param hoka the HelpOnKeyword action
89      * @return MenuItem
90      */
91     protected static MenuItem createMenu(final String label1, final String label2, final SciNotes editor, KeyStroke key, final HelpOnKeywordAction hoka) {
92         final MenuItem menuitem = createMenu(label1, null, hoka, key);
93         ((JMenuItem) menuitem.getAsSimpleMenuItem()).addPropertyChangeListener(new PropertyChangeListener() {
94                 public void propertyChange(PropertyChangeEvent e) {
95                     String select = editor.getTextPane().getSelectedText();
96                     if (select == null) {
97                         KeywordEvent kwe = ((ScilabEditorPane) editor.getTextPane()).getKeywordEvent(!hoka.isPopup, true);
98                         if (ScilabLexerConstants.isHelpable(kwe.getType())) {
99                             try {
100                                 String kw = editor.getTextPane().getDocument().getText(kwe.getStart(), kwe.getLength());
101                                 menuitem.setText(label1 + SciNotesMessages.QUOTE + kw + SciNotesMessages.QUOTE);
102                                 menuitem.setEnabled(true);
103                             } catch (BadLocationException ex) { }
104                         } else {
105                             menuitem.setText(label1 + SciNotesMessages.DOTS);
106                             menuitem.setEnabled(false);
107                         }
108                     } else {
109                         menuitem.setText(label2);
110                         menuitem.setEnabled(true);
111                     }
112                 }
113             });
114
115         return menuitem;
116     }
117 }