Bug 7678 fixed: Help action didn't give help on selection.
[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     /**
38      * Constructor
39      * @param name the name of the action
40      * @param editor SciNotes
41      */
42     public HelpOnKeywordAction(String name, SciNotes editor) {
43         super(name, editor);
44     }
45
46     /**
47      * doAction
48      */
49     public void doAction() {
50         String selection = "";
51         int start = getEditor().getTextPane().getSelectionStart();
52         int end = getEditor().getTextPane().getSelectionEnd();
53         try {
54             if (start == end) {
55                 KeywordEvent kwe = ((ScilabEditorPane) getEditor().getTextPane()).getKeywordEvent();
56                 if (ScilabLexerConstants.isHelpable(kwe.getType())) {
57                     selection = getEditor().getTextPane().getDocument().getText(kwe.getStart(), kwe.getLength());
58                 }
59             } else {
60                 selection = getEditor().getTextPane().getDocument().getText(start, end - start);
61             }
62         } catch (BadLocationException e) { }
63
64         InterpreterManagement.requestScilabExec("help('" + selection + "')");
65     }
66
67     /**
68      * createMenu
69      * @param label label of the menu
70      * @param editor SciNotes
71      * @param key Keystroke
72      * @return MenuItem
73      */
74     public static MenuItem createMenu(String label, final SciNotes editor, KeyStroke key) {
75         StringTokenizer token = new StringTokenizer(label, ";");
76         final String label1 = token.nextToken();
77         final String label2 = token.nextToken();
78         final MenuItem menuitem = createMenu(label1, null, new HelpOnKeywordAction(label1 + SciNotesMessages.DOTS, editor), key);
79         ((JMenuItem) menuitem.getAsSimpleMenuItem()).addPropertyChangeListener(new PropertyChangeListener() {
80                 public void propertyChange(PropertyChangeEvent e) {
81                     String select = editor.getTextPane().getSelectedText();
82                     if (select == null) {
83                         KeywordEvent kwe = ((ScilabEditorPane) editor.getTextPane()).getKeywordEvent();
84                         if (ScilabLexerConstants.isHelpable(kwe.getType())) {
85                             try {
86                                 String kw = editor.getTextPane().getDocument().getText(kwe.getStart(), kwe.getLength());
87                                 menuitem.setText(label1 + SciNotesMessages.QUOTE + kw + SciNotesMessages.QUOTE);
88                                 menuitem.setEnabled(true);
89                             } catch (BadLocationException ex) { }
90                         } else {
91                             menuitem.setText(label1 + SciNotesMessages.DOTS);
92                             menuitem.setEnabled(false);
93                         }
94                     } else {
95                         menuitem.setText(label2);
96                         menuitem.setEnabled(true);
97                     }
98                 }
99             });
100
101         return menuitem;
102     }
103 }