971893491fea5c09dfd738277054fec928cb39c3
[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 org.scilab.modules.completion.Completion;
21 import org.scilab.modules.localization.Messages;
22
23 import com.artenum.rosetta.core.CompletionItemImpl;
24 import com.artenum.rosetta.interfaces.core.CompletionItem;
25 import com.artenum.rosetta.interfaces.core.CompletionManager;
26 import com.artenum.rosetta.interfaces.core.GenericInterpreter;
27 import com.artenum.rosetta.interfaces.core.InputParsingManager;
28
29
30 /**
31  * Class used completion management in Scilab Java Console
32  * @author Vincent COUVERT
33  */
34
35 public class SciCompletionManager implements CompletionManager {
36
37     protected List<CompletionItem> dictionnary;
38     private InputParsingManager inputParsingManager;
39
40     /**
41      * Create a fake database of completion information
42      */
43     public SciCompletionManager() {
44     }
45
46     /**
47      * Get all completion items matching currently edited line
48      * @return array list of matching items
49      * @see com.artenum.rosetta.interfaces.core.CompletionManager#getCompletionItems()
50      */
51     @Override
52     public List<CompletionItem> getCompletionItems() {
53         int compLevel = inputParsingManager.getCompletionLevel();
54
55         // Build dictionnary
56         dictionnary     = new ArrayList<CompletionItem>();
57
58         // Get the completion part used to filter the paths/files dictionary
59
60         String fileSearchedPattern = ((SciInputParsingManager) inputParsingManager).getFilePartLevel(compLevel);
61
62         String[] scilabFilesDictionnary = Completion.searchFilesDictionary(fileSearchedPattern);
63         //addItemsToDictionnary(Messages.gettext("File or Directory"), scilabFilesDictionnary);
64
65         if (scilabFilesDictionnary != null) {
66             ArrayList<String> files = new ArrayList<String>();
67             ArrayList<String> directories = new ArrayList<String>();
68             separateFilesDirectories(scilabFilesDictionnary, files, directories);
69             String[] filesDictionnary = files.toArray(new String[files.size()]);
70             String[] directoriesDictionnary = directories.toArray(new String[directories.size()]);
71
72             addItemsToDictionnary(Messages.gettext("File"), filesDictionnary);
73             addItemsToDictionnary(Messages.gettext("Directory"), directoriesDictionnary);
74         } else {
75             // Get the completion part used to filter the dictionary
76             String searchedPattern = inputParsingManager.getPartLevel(compLevel);
77             String commandLine = inputParsingManager.getCommandLine();
78             String[] scilabFieldsDictionnary = Completion.searchFieldsDictionary(commandLine, searchedPattern);
79             if (scilabFieldsDictionnary != null) {
80                 addItemsToDictionnary(Messages.gettext("Field"), scilabFieldsDictionnary);
81             } else {
82                 String[] scilabCommandsDictionnary = Completion.searchCommandsDictionary(searchedPattern);
83                 addItemsToDictionnary(Messages.gettext("Scilab Command"), scilabCommandsDictionnary);
84
85                 String[] scilabFunctionsDictionnary = Completion.searchFunctionsDictionary(searchedPattern);
86                 addItemsToDictionnary(Messages.gettext("Scilab Function"), scilabFunctionsDictionnary);
87
88                 String[] scilabHandlesDictionnary = Completion.searchHandleGraphicsPropertiesDictionary(searchedPattern);
89                 addItemsToDictionnary(Messages.gettext("Graphics handle field"), scilabHandlesDictionnary);
90
91                 String[] scilabMacrosDictionnary = Completion.searchMacrosDictionary(searchedPattern);
92                 addItemsToDictionnary(Messages.gettext("Scilab Macro"), scilabMacrosDictionnary);
93
94                 String[] scilabVariablesDictionnary = Completion.searchVariablesDictionary(searchedPattern);
95                 addItemsToDictionnary(Messages.gettext("Scilab Variable"), scilabVariablesDictionnary);
96             }
97         }
98         return dictionnary;
99     }
100
101     /**
102      * Associate a parsing tool to this completion manager
103      * @param inputParsingManager a parsing tool
104      * @see com.artenum.rosetta.interfaces.core.CompletionManager#setInputParsingManager(com.artenum.rosetta.interfaces.core.InputParsingManager)
105      */
106     @Override
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     @Override
117     public void setInterpretor(GenericInterpreter interpretor) {
118         // No need for Scilab implementation
119     }
120
121     /**
122      * Add items to current completion dictionnary
123      * @param type type of the items to add
124      * @param items all items to add
125      */
126     public void addItemsToDictionnary(String type, String[] items) {
127         if (items != null) {
128             for (int i = 0; i < items.length; i++) {
129                 dictionnary.add(new CompletionItemImpl(type, items[i] + " (" + type + ")", items[i], Messages.gettext("No help")));
130             }
131         }
132     }
133
134     /**
135      * Separate files from directories
136      * @param scilabFilesDictionnary the input containing both
137      * @param filesDictionnary output: only the files
138      * @param directoriesDictionnary output: only the directories
139      */
140     public void separateFilesDirectories(String[] scilabFilesDictionnary, ArrayList<String> filesDictionnary, ArrayList<String> directoriesDictionnary) {
141         String fileSep = System.getProperty("file.separator");
142         for (String word : scilabFilesDictionnary) {
143             if (word.endsWith(fileSep)) {
144                 directoriesDictionnary.add(new String(word));
145             } else {
146                 filesDictionnary.add(new String(word));
147             }
148         }
149     }
150 }