92af6908e7637c4c48d49f5fe7191c6a78e2c29c
[scilab.git] / scilab / modules / console / src / java / org / scilab / modules / console / SciCompletionManager.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007-2008 - INRIA - Vincent COUVERT
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 package org.scilab.modules.console;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.io.File;
21
22 import org.scilab.modules.completion.Completion;
23 import org.scilab.modules.localization.Messages;
24
25 import com.artenum.rosetta.core.CompletionItemImpl;
26 import com.artenum.rosetta.interfaces.core.CompletionItem;
27 import com.artenum.rosetta.interfaces.core.CompletionManager;
28 import com.artenum.rosetta.interfaces.core.GenericInterpreter;
29 import com.artenum.rosetta.interfaces.core.InputParsingManager;
30
31
32 /**
33  * Class used completion management in Scilab Java Console
34  * @author Vincent COUVERT
35  */
36
37 public class SciCompletionManager implements CompletionManager {
38
39     protected List<CompletionItem> dictionnary;
40     private InputParsingManager inputParsingManager;
41
42     /**
43      * Create a fake database of completion information
44      */
45     public SciCompletionManager() {
46     }
47
48     /**
49      * Get all completion items matching currently edited line
50      * @return array list of matching items
51      * @see com.artenum.rosetta.interfaces.core.CompletionManager#getCompletionItems()
52      */
53     public List<CompletionItem> getCompletionItems() {
54         int compLevel = inputParsingManager.getCompletionLevel();
55
56         // Build dictionnary
57         dictionnary     = new ArrayList<CompletionItem>();
58
59         // Get the completion part used to filter the paths/files dictionary
60
61         String fileSearchedPattern = ((SciInputParsingManager) inputParsingManager).getFilePartLevel(compLevel);
62
63         String[] scilabFilesDictionnary = Completion.searchFilesDictionary(fileSearchedPattern);
64         //addItemsToDictionnary(Messages.gettext("File or Directory"), scilabFilesDictionnary);
65
66         if (scilabFilesDictionnary != null) {
67             ArrayList<String> files = new ArrayList<String>();
68             ArrayList<String> directories = new ArrayList<String>();
69             separateFilesDirectories(scilabFilesDictionnary, files, directories);
70             String[] filesDictionnary = files.toArray(new String[files.size()]);
71             String[] directoriesDictionnary = directories.toArray(new String[directories.size()]);
72
73             addItemsToDictionnary(Messages.gettext("File"), filesDictionnary);
74             addItemsToDictionnary(Messages.gettext("Directory"), directoriesDictionnary);
75         } else {
76             // Get the completion part used to filter the dictionary
77             String searchedPattern = inputParsingManager.getPartLevel(compLevel);
78             String commandLine = inputParsingManager.getCommandLine();
79             String[] scilabFieldsDictionnary = Completion.searchFieldsDictionary(commandLine, searchedPattern);
80             if (scilabFieldsDictionnary != null) {
81                 addItemsToDictionnary(Messages.gettext("Field"), scilabFieldsDictionnary);
82             } else {
83                 String[] scilabCommandsDictionnary = Completion.searchCommandsDictionary(searchedPattern);
84                 addItemsToDictionnary(Messages.gettext("Scilab Command"), scilabCommandsDictionnary);
85
86                 String[] scilabFunctionsDictionnary = Completion.searchFunctionsDictionary(searchedPattern);
87                 addItemsToDictionnary(Messages.gettext("Scilab Function"), scilabFunctionsDictionnary);
88
89                 String[] scilabHandlesDictionnary = Completion.searchHandleGraphicsPropertiesDictionary(searchedPattern);
90                 addItemsToDictionnary(Messages.gettext("Graphics handle field"), scilabHandlesDictionnary);
91
92                 String[] scilabMacrosDictionnary = Completion.searchMacrosDictionary(searchedPattern);
93                 addItemsToDictionnary(Messages.gettext("Scilab Macro"), scilabMacrosDictionnary);
94
95                 String[] scilabVariablesDictionnary = Completion.searchVariablesDictionary(searchedPattern);
96                 addItemsToDictionnary(Messages.gettext("Scilab Variable"), scilabVariablesDictionnary);
97             }
98         }
99         return dictionnary;
100     }
101
102     /**
103      * Associate a parsing tool to this completion manager
104      * @param inputParsingManager a parsing tool
105      * @see com.artenum.rosetta.interfaces.core.CompletionManager#setInputParsingManager(com.artenum.rosetta.interfaces.core.InputParsingManager)
106      */
107     public void setInputParsingManager(InputParsingManager inputParsingManager) {
108         this.inputParsingManager = inputParsingManager;
109     }
110
111     /**
112      * Associate an interpreting tool to this completion manager
113      * @param  interpretor an interpreting tool
114      * @see com.artenum.rosetta.interfaces.core.CompletionManager#setInputParsingManager(com.artenum.rosetta.interfaces.core.InputParsingManager)
115      */
116     public void setInterpretor(GenericInterpreter interpretor) {
117         // No need for Scilab implementation
118     }
119
120     /**
121      * Add items to current completion dictionnary
122      * @param type type of the items to add
123      * @param items all items to add
124      */
125     public void addItemsToDictionnary(String type, String[] items) {
126         if (items != null) {
127             for (int i = 0; i < items.length; i++) {
128                 dictionnary.add(new CompletionItemImpl(type, items[i] + " (" + type + ")", items[i], Messages.gettext("No help")));
129             }
130         }
131     }
132
133     /**
134      * Separate files from directories
135      * @param scilabFilesDictionnary the input containing both
136      * @param filesDictionnary output: only the files
137      * @param directoriesDictionnary output: only the directories
138      */
139     public void separateFilesDirectories(String[] scilabFilesDictionnary, ArrayList<String> filesDictionnary, ArrayList<String> directoriesDictionnary) {
140         for (int i = 0; i < scilabFilesDictionnary.length; ++i) {
141             File cur = new File(scilabFilesDictionnary[i]);
142             if (cur.isDirectory()) {
143                 directoriesDictionnary.add(new String(scilabFilesDictionnary[i]));
144             } else {
145                 filesDictionnary.add(new String(scilabFilesDictionnary[i]));
146             }
147         }
148     }
149
150 }