Bug 12284 fixed: Completion in console could to a crash (or deadlock)
[scilab.git] / scilab / modules / console / src / java / org / scilab / modules / console / SciInputParsingManager.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007-2008 - INRIA - Vincent COUVERT
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.console;
14
15 import java.awt.Point;
16
17 import javax.swing.JPanel;
18
19 import com.artenum.rosetta.interfaces.core.InputParsingManager;
20 import com.artenum.rosetta.interfaces.ui.InputCommandView;
21 import com.artenum.rosetta.interfaces.ui.PromptView;
22 import com.artenum.rosetta.util.StringConstants;
23
24 import org.scilab.modules.completion.Completion;
25
26 /**
27  * @author Vincent COUVERT
28  *
29  */
30 public class SciInputParsingManager implements InputParsingManager {
31
32     private InputCommandView inputCommandView;
33     private PromptView promptView;
34     private Point windowCompletionPosition;
35
36     /**
37      * Default constructor
38      */
39     public SciInputParsingManager() {
40         windowCompletionPosition = new Point(0, 0);
41     }
42
43     /**
44      * Append a string to the console input
45      * @param content the string to append
46      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#append(java.lang.String)
47      */
48     public void append(String content) {
49         inputCommandView.append(content);
50     }
51
52     /**
53      * Get the position of the caret in the console input
54      * @return the position as an int value
55      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#getCaretPosition()
56      */
57     public int getCaretPosition() {
58         return inputCommandView.getCaretPosition();
59     }
60
61     /**
62      * Read the text entered (by the user) in the console
63      * @return the text entered
64      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#getCommandLine()
65      */
66     public String getCommandLine() {
67         return inputCommandView.getText();
68     }
69
70     /**
71      * Get the level to use for completion (which keywork we sould use for completion ?)
72      * @return the level
73      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#getCompletionLevel()
74      */
75     public int getCompletionLevel() {
76         // Always zero for first implementation in Scilab
77         return 0;
78     }
79
80     /**
81      * Get the number of lines in the console input
82      * @return the number of lines
83      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#getNumberOfLines()
84      */
85     public int getNumberOfLines() {
86         int result = inputCommandView.getText().split(StringConstants.NEW_LINE).length;
87         if (inputCommandView.getText().lastIndexOf(StringConstants.NEW_LINE) != -1) {
88             result++;
89         }
90         return result;
91     }
92
93     /**
94      * Get the string to use for completion (see completion level)
95      * @param level the level used for completion
96      * @return the string to use as a keyword for completion
97      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#getPartLevel(int)
98      */
99     public String getPartLevel(int level) {
100         String returnLine = "";
101         String wholeLine = getCommandLine();
102         int caretPos = getCaretPosition();
103
104         String lineToParse = wholeLine.substring(0, caretPos);
105         if (lineToParse.length() > 0) {
106             returnLine = Completion.getPartLevel(lineToParse);
107         }
108         return returnLine;
109     }
110
111     /**
112      * Get the string to use for completion (see completion level)
113      * @param level the level used for completion
114      * @return the string to use as a keyword for completion
115      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#getPartLevel(int)
116      */
117     public String getFilePartLevel(int level) {
118         String returnLine = null;
119         String wholeLine = getCommandLine();
120         int caretPos = getCaretPosition();
121
122         String lineToParse = wholeLine.substring(0, caretPos);
123         if (lineToParse.length() > 0) {
124             returnLine = Completion.getFilePartLevel(lineToParse);
125         }
126         return returnLine;
127     }
128
129     /**
130      * Get the position where the completion window has to be displayed
131      * @return the position
132      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#getWindowCompletionLocation()
133      */
134     public Point getWindowCompletionLocation() {
135         windowCompletionPosition.setLocation(inputCommandView.getCaretLocation());
136         windowCompletionPosition.translate(-((JPanel) promptView).getWidth(), 0);
137         return windowCompletionPosition;
138     }
139
140     /**
141      * Is a block currently edited in the console input ?
142      * @return true if a block is currently edited (false else)
143      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#isBlockEditing()
144      */
145     public boolean isBlockEditing() {
146         // FIXME : No block editing by default
147         return false;
148     }
149
150     /**
151      * Reset the input of the console (delete all entries)
152      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#reset()
153      */
154     public void reset() {
155         inputCommandView.reset();
156     }
157
158     /**
159      * Set the input command view associated to this parsing manager
160      * @param inputCommandView the command view object to associate
161      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#setInputCommandView(com.artenum.rosetta.interfaces.ui.InputCommandView)
162      */
163     public void setInputCommandView(InputCommandView inputCommandView) {
164         this.inputCommandView = inputCommandView;
165     }
166
167     /**
168      * Append the text selected in the completioon window to the console input
169      * @param completionResult the string to append
170      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#writeCompletionPart(java.lang.String)
171      */
172     public void writeCompletionPart(String completionResult) {
173         // Add to the input view the end of the selected item
174         inputCommandView.append(completionResult.substring(getPartLevel(getCompletionLevel()).length()));
175     }
176
177     /**
178      * Delete the character just before the caret position
179      * @see com.artenum.rosetta.interfaces.core.InputParsingManager#backspace()
180      */
181     public void backspace() {
182         inputCommandView.backspace();
183     }
184
185     /**
186      * Get the prompt view associated to the parsing manager
187      * @return the promptView to associate
188      */
189     public PromptView getPromptView() {
190         return promptView;
191     }
192
193     /**
194      * Set the prompt view associated to the parsing manager
195      * @param promptView the promptView to set
196      */
197     public void setPromptView(PromptView promptView) {
198         this.promptView = promptView;
199     }
200
201 }