Bug 8135 fixed: An exception was thrown when restoring files on MacOS X
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / actions / GenerateHelpFromFunctionAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
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.List;
18
19 import javax.swing.JMenuItem;
20 import javax.swing.KeyStroke;
21 import javax.swing.text.Element;
22 import javax.swing.text.BadLocationException;
23
24 import org.scilab.modules.gui.menuitem.MenuItem;
25 import org.scilab.modules.scinotes.SciNotes;
26 import org.scilab.modules.scinotes.ScilabEditorPane;
27 import org.scilab.modules.scinotes.ScilabDocument;
28 import org.scilab.modules.scinotes.FunctionScanner;
29
30 /**
31  * Generate help from a function definition
32  * @author Calixte DENIZET
33  */
34 public class GenerateHelpFromFunctionAction extends DefaultAction {
35
36     /**
37      * The help template
38      */
39     public static final String TEMPLATE = "//\n"
40         + "//\n"
41         + "// Calling Sequence\n"
42         + "// [returnValues] = functionName(argsValues) // \n"
43         + "// Parameters\n"
44         + "// argsValuesOnColumn\n"
45         + "// returnValuesOnColumn\n"
46         + "// \n"
47         + "// Description\n"
48         + "// \n"
49         + "// \n"
50         + "// Examples\n"
51         + "// \n"
52         + "// \n"
53         + "// See Also\n"
54         + "// \n"
55         + "// \n"
56         + "// Authors\n"
57         + "// \n"
58         + "\n";
59
60     /**
61      * Constructor
62      * @param name the name of the action
63      * @param editor SciNotes
64      */
65     public GenerateHelpFromFunctionAction(String name, SciNotes editor) {
66         super(name, editor);
67     }
68
69     /**
70      * doAction
71      */
72     public void doAction() {
73         ScilabEditorPane sep = (ScilabEditorPane) getEditor().getTextPane();
74         int pos = sep.getCaretPosition();
75         ScilabDocument doc = (ScilabDocument) sep.getDocument();
76         Element root = doc.getDefaultRootElement();
77         Element e = root.getElement(root.getElementIndex(pos));
78         if (e instanceof ScilabDocument.ScilabLeafElement) {
79             ScilabDocument.ScilabLeafElement se = (ScilabDocument.ScilabLeafElement) e;
80             if (se.isFunction()) {
81                 FunctionScanner.FunctionInfo info = se.getFunctionInfo();
82                 String help = TEMPLATE.replaceFirst("functionName", info.functionName);
83                 help = help.replaceFirst("returnValues", generateList(info.returnValues, ", ", ""));
84                 help = help.replaceFirst("argsValues", generateList(info.argsValues, ", ", ""));
85                 help = help.replaceFirst("returnValuesOnColumn", generateList(info.returnValues, ": \n// ", ": "));
86                 help = help.replaceFirst("argsValuesOnColumn", generateList(info.argsValues, ": \n// ", ": "));
87                 try {
88                     doc.mergeEditsEnd();
89                     doc.insertString(e.getEndOffset(), help, null);
90                 } catch (BadLocationException exc) { }
91             }
92         }
93     }
94
95     /**
96      * Generate a string containing the list gave as argument in using sep as separator
97      * @param list the list
98      * @param sep the separator
99      * @param end a String to close
100      * @return the generated String
101      */
102     private String generateList(List<String> list, String sep, String end) {
103         String str = "";
104         for (int i = 0; i < list.size() - 1; i++) {
105             str += list.get(i) + sep;
106         }
107         if (list.size() >= 1) {
108             str += list.get(list.size() - 1) + end;
109         }
110
111         return str;
112     }
113
114     /**
115      * createMenu
116      * @param label label of the menu
117      * @param editor SciNotes
118      * @param key Keystroke
119      * @return MenuItem
120      */
121     public static MenuItem createMenu(String label, final SciNotes editor, KeyStroke key) {
122         final MenuItem menuitem = createMenu(label, null, new GenerateHelpFromFunctionAction(label, editor), key);
123         ((JMenuItem) menuitem.getAsSimpleMenuItem()).addPropertyChangeListener(new PropertyChangeListener() {
124                 public void propertyChange(PropertyChangeEvent e) {
125                     if (editor.getTextPane() != null) {
126                         Element root = editor.getTextPane().getDocument().getDefaultRootElement();
127                         int pos = editor.getTextPane().getCaretPosition();
128                         ScilabDocument.ScilabLeafElement elem = (ScilabDocument.ScilabLeafElement) root.getElement(root.getElementIndex(pos));
129                         menuitem.setEnabled(elem.isFunction());
130                     }
131                 }
132             });
133
134         return menuitem;
135     }
136 }