Statistics
| Revision:

gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.swing / org.gvsig.scripting.swing.impl / src / main / java / org / gvsig / scripting / swing / impl / DefaultScriptingUIManager.java @ 1063

History | View | Annotate | Download (14.5 KB)

1
package org.gvsig.scripting.swing.impl;
2

    
3
import java.net.URL;
4
import java.util.ArrayList;
5
import java.util.Collection;
6
import java.util.Collections;
7
import java.util.Comparator;
8
import java.util.HashMap;
9
import java.util.HashSet;
10
import java.util.LinkedHashMap;
11
import java.util.List;
12
import java.util.Locale;
13
import java.util.Map;
14
import java.util.Set;
15
import javax.swing.Action;
16
import javax.swing.ImageIcon;
17
import javax.swing.JButton;
18
import javax.swing.JComboBox;
19
import javax.swing.JComponent;
20
import javax.swing.JPanel;
21
import javax.swing.JTextField;
22
import org.gvsig.about.AboutLocator;
23
import org.gvsig.about.AboutManager;
24
import org.gvsig.scripting.ScriptingDialog;
25
import org.gvsig.scripting.ScriptingFolder;
26
import org.gvsig.scripting.ScriptingLocator;
27
import org.gvsig.scripting.ScriptingManager;
28
import org.gvsig.scripting.ScriptingScript;
29
import org.gvsig.scripting.ScriptingUnit;
30
import org.gvsig.scripting.swing.api.CreateComponentListener;
31
import org.gvsig.scripting.swing.api.EditorFactory;
32
import org.gvsig.scripting.swing.api.JCodeEditor;
33
import org.gvsig.scripting.swing.api.JDialogEditor;
34
import org.gvsig.scripting.swing.api.JEditor;
35
import org.gvsig.scripting.swing.api.JScriptingBrowser;
36
import org.gvsig.scripting.swing.api.JScriptingComposer;
37
import org.gvsig.scripting.swing.api.JScriptingConsole;
38
import org.gvsig.scripting.swing.api.JScriptingLauncher;
39
import org.gvsig.scripting.swing.api.JThinG;
40
import org.gvsig.scripting.swing.api.JThinlet;
41
import org.gvsig.scripting.swing.api.ScriptingUIManager;
42
import org.gvsig.scripting.swing.api.ScriptingUIManager.MenuEntry;
43
import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent;
44
import org.gvsig.scripting.swing.impl.composer.DefaultJScriptingComposer;
45
import org.gvsig.scripting.swing.impl.composer.editors.DialogEditor;
46
import org.gvsig.scripting.swing.impl.composer.editors.DialogEditorFactory;
47
import org.gvsig.scripting.swing.impl.composer.editors.ExternalFileEditorFactory;
48
import org.gvsig.scripting.swing.impl.composer.editors.PropertiesEditorFactory;
49
import org.gvsig.scripting.swing.impl.composer.editors.ScriptEditor;
50
import org.gvsig.scripting.swing.impl.composer.editors.ScriptEditorFactory;
51
import org.gvsig.scripting.swing.impl.composer.editors.TextEditorFactory;
52
import org.gvsig.scripting.swing.impl.syntaxhighlight.JEditorPaneSyntaxHighlighting;
53
import org.gvsig.scripting.swing.impl.syntaxhighlight.JRSyntaxTextArea;
54
import org.gvsig.scripting.swing.impl.tools.DefaultScriptChooserPanel;
55
import org.gvsig.scripting.swing.impl.tools.ScriptListPickerController;
56
import org.gvsig.scripting.swing.impl.tools.ScriptPickerController;
57
import org.gvsig.scripting.swing.impl.tools.ScriptSwingManager;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.i18n.I18nManager;
60
import org.gvsig.tools.script.Script;
61
import org.gvsig.tools.swing.api.Component;
62
import org.gvsig.tools.swing.api.ToolsSwingLocator;
63
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
64
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
65
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
66
import org.slf4j.Logger;
67
import org.slf4j.LoggerFactory;
68

    
69
public class DefaultScriptingUIManager 
70
        implements ScriptingUIManager , ScriptSwingManager
71
    {
72

    
73
    private final static Logger logger = LoggerFactory.getLogger(DefaultScriptingUIManager.class);
74
    
75
    private final ScriptingManager manager;
76
    private final Map<String, URL> userHelps = new HashMap<>();
77
    private I18nManager i18nManager;
78
    private WindowManager windowsManager = null;
79
    private final Map<String,Action> composerTools = new LinkedHashMap<>();
80
    private final Map<String,MenuEntry> composerMenus = new LinkedHashMap<>();
81
    private JScriptingComposer activeComposer;
82
    private Set<CreateComponentListener> createComponentListeners;    
83
    private final Map<String,EditorFactory> editorFactories = new HashMap<>();
84
    private List<EditorFactory> editorFactoriesOrderer = null;
85
    
86
    private static class DefaultMenuEntry implements MenuEntry {
87
        private final Action action;
88
        private final String text;
89

    
90
        public DefaultMenuEntry(String text, Action action) {
91
            this.text = text;
92
            this.action = action;
93
        }
94

    
95
        @Override
96
        public String getText() {
97
            return this.text;
98
        }
99

    
100
        @Override
101
        public Action getAction() {
102
            return this.action;
103
        }
104
        
105
    }
106
    public DefaultScriptingUIManager() {
107

    
108
        this.manager = ScriptingLocator.getManager();
109
        this.manager.put("ScriptingUIManager", this); // ??????
110
        
111
        this.i18nManager = ToolsLocator.getI18nManager();
112
        this.init();
113
    }
114
    
115
    private void init() {
116
        this.registerEditor(new DialogEditorFactory());
117
        this.registerEditor(new ScriptEditorFactory());
118
        this.registerEditor(new TextEditorFactory());
119
        this.registerEditor(new ExternalFileEditorFactory());
120
        this.registerEditor(new PropertiesEditorFactory());
121
    }
122
    
123
    @Override
124
    public void addCreatedComponentListener(CreateComponentListener listener) {
125
        if( this.createComponentListeners==null ) {
126
            this.createComponentListeners = new HashSet<>();
127
        }
128
        this.createComponentListeners.add(listener);
129
    }
130
    
131
    @Override
132
    public void removeCreatedComponentListener(CreateComponentListener listener) {
133
        if( this.createComponentListeners==null ) {
134
            return;
135
        }
136
        this.createComponentListeners.remove(listener);
137
    }
138
    
139
    public void fireCreateComponent(Component component) {
140
        if (this.createComponentListeners == null) {
141
            return;
142
        }
143
        for (CreateComponentListener listener : this.createComponentListeners) {
144
            try {
145
                listener.componentCreated(component);
146
            } catch (Throwable th) {
147
                String s = "unknow";
148
                try {
149
                    s = component.getClass().getName();
150
                } catch(Throwable th1) {
151
                }
152
                logger.warn("Problems call listener",th);
153
            }
154
        }
155
    }
156
    
157
    @Override
158
    public JScriptingComposer createComposer() {
159
        JScriptingComposer composer = new DefaultJScriptingComposer(this);
160
        fireCreateComponent(composer);
161
        return composer;
162
    }
163

    
164
    @Override
165
    public JPanel createInstaller() {
166
        // TODO Auto-generated method stub
167
        return null;
168
    }
169

    
170
    @Override
171
    public JScriptingLauncher createLauncher() {
172
        JScriptingLauncher launcher = new DefaultJScriptingLauncher(this);
173
        fireCreateComponent(launcher);
174
        return launcher;
175
    }
176

    
177
    @Override
178
    public ImageIcon getIcon(String name) {
179
        return this.getIcon(name, null);
180
    }
181

    
182
    @Override
183
    public ImageIcon getIcon(String name, String size) {
184
        if (name == null) {
185
            return new ImageIcon();
186
        }
187
        String tamanyo = "16x16/";
188
        if (size != null && size.equals("big")) {
189
            tamanyo = "32x32/";
190
        }
191
        ClassLoader loader = this.getClass().getClassLoader();
192
        URL url = loader.getResource("org/gvsig/scripting/images/" + tamanyo + name + ".png");
193
        if (url == null) {
194
            url = loader.getResource("org/gvsig/scripting/images/" + tamanyo + "image-missing.png");
195
        }
196
        if (url == null) {
197
            return new ImageIcon();
198
        }
199
        return new ImageIcon(url);
200
    }
201

    
202
    @Override
203
    public ScriptingManager getManager() {
204
        return this.manager;
205
    }
206

    
207
    public String[] getPrerreferedLanguages() {
208
        String curr = Locale.getDefault().getLanguage().toLowerCase();
209
        if (curr.equals("gl")) {
210
            return new String[]{"gl", "es", "en"};
211
        }
212
        if (curr.equals("ca")) {
213
            return new String[]{"ca", "es", "en"};
214
        }
215
        if (curr.equals("eu")) {
216
            return new String[]{"eu", "es", "en"};
217
        }
218
        if (curr.equals("va")) {
219
            return new String[]{"va", "ca", "es", "en"};
220
        }
221
        return new String[]{curr, "en", "es"};
222
    }
223

    
224
    @Override
225
    public AboutManager getAboutManager() {
226
        return AboutLocator.getManager();
227
    }
228

    
229
    private void showWindow(JComponent panel, String title, WindowManager.MODE mode) {
230
        WindowManager winmanager = this.getWindowManager();
231
        if( winmanager instanceof WindowManager_v2 ) {
232
            ((WindowManager_v2)winmanager).showWindow(panel, title, mode, getIcon("scripting_python").getImage());
233
        } else {
234
            winmanager.showWindow(panel, title, mode);
235
        }
236
    }
237
    
238
    @Override
239
    public void showDialog(JComponent panel, String title) {
240
        this.showWindow(panel, title, WindowManager.MODE.DIALOG);
241
    }
242

    
243
    @Override
244
    public void showWindow(JComponent panel, String title) {
245
        this.showWindow(panel, title, WindowManager.MODE.WINDOW);
246
    }
247

    
248
    @Override
249
    public void showTool(JComponent panel, String title) {
250
        this.showWindow(panel, title, WindowManager.MODE.TOOL);
251
    }
252

    
253
    @Override
254
    public JScriptingBrowser createBrowser(ScriptingFolder root, boolean foldersOnly) {
255
        JScriptingBrowser browser = new DefaultJScriptingBrowser(this, root, foldersOnly);
256
        fireCreateComponent(browser);
257
        return browser;
258
    }
259

    
260
    @Override
261
    public JScriptingBrowser createBrowser(ScriptingFolder root) {
262
        return this.createBrowser(root,false);
263
    }
264

    
265
    @Override
266
    public JCodeEditor createJCodeEditor(ScriptingScript script) {
267
        JCodeEditor editor = new ScriptEditor(this, script);
268
        fireCreateComponent(editor);
269
        return editor;
270
    }
271

    
272
    @Override
273
    public JDialogEditor createJDialogEditor(ScriptingDialog script) {
274
        return new DialogEditor(this, script);
275
    }
276

    
277
    @Override
278
    public JThinG createJThinG() {
279
        JThinG thing = new DefaultJThinG();
280
        return thing;
281
    }
282

    
283
    @Override
284
    public JThinlet createJThinlet() {
285
        JThinlet thinlet = new DefaultJThinlet();
286
        return thinlet;
287
    }
288

    
289
    @Override
290
    public SyntaxtHighlightTextComponent createSyntaxHighlightingPanel() {
291
        try {
292
            return new JRSyntaxTextArea();
293
        } catch (Throwable t) {
294
            logger.info("Can't create advanced SyntaxHighlightingPanel.", t);
295
            return new JEditorPaneSyntaxHighlighting();
296
        }
297
    }
298

    
299
    @Override
300
    public String getTranslation(String key) {
301
        if (this.i18nManager == null) {
302
            this.i18nManager = ToolsLocator.getI18nManager();
303
        }
304
        return i18nManager.getTranslation(key);
305
    }
306

    
307
    @Override
308
    public WindowManager getWindowManager() {
309
        if( this.windowsManager==null ) {
310
            this.windowsManager = ToolsSwingLocator.getWindowManager();
311
        }
312
        return this.windowsManager;
313
    }
314

    
315
    @Override
316
    public void setWindowManager(WindowManager windowsManager) {
317
        this.windowsManager = windowsManager;
318
    }
319

    
320
    @Override
321
    public JScriptingConsole createJScriptingConsole() {
322
        return this.createJScriptingConsole(true);
323
    }
324

    
325
    @Override
326
    public JScriptingConsole createJScriptingConsole(boolean captureOutput) {
327
        JScriptingConsole console = new DefaultJScriptingConsole(captureOutput);
328
        fireCreateComponent(console);
329
        return console;
330
    }
331

    
332
    @Override
333
    public void addComposerMenu(String text, Action action) {
334
        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
335
        this.composerMenus.put(name,new DefaultMenuEntry(text,action));
336
    }
337

    
338
    @Override
339
    public void addComposerTool(Action action) {
340
        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
341
        this.composerTools.put(name,action);
342
    }
343

    
344
    @Override
345
    public Collection<MenuEntry> getComposerMenus() {
346
        return this.composerMenus.values();
347
    }
348

    
349
    @Override
350
    public Collection<Action> getComposerTools() {
351
        return this.composerTools.values();
352
    }
353
    
354
    @Override
355
    public JEditor createEditor(ScriptingUnit unit) {
356
        JEditor editor = null;
357
        for (EditorFactory factory : this.getEditorFactories() ) {
358
            try {
359
                if( factory.canCreate(unit) ) {
360
                    editor = factory.create(unit);
361
                    fireCreateComponent(editor);
362
                    break;
363
                }
364
            } catch(Exception ex) {
365
                logger.warn("Can't create an editor with factory '"+factory.getClass().getName()+"' for '"+unit.getClass().getName()+"'.",ex);
366
            }
367
        }
368
        return editor;
369
    }
370

    
371
    @Override
372
    public boolean hasEditor(ScriptingUnit unit) {
373
        if( unit == null ) {
374
            return false;
375
        }
376
        for (EditorFactory factory : this.getEditorFactories() ) {
377
            try {
378
                if( factory.canCreate(unit) ) {
379
                    return true;
380
                }
381
            } catch(Exception ex) {
382
                logger.warn("Can't check if factory '"+factory.getClass().getName()+"' can create an editor for '"+unit.getClass().getName()+"'.",ex);
383
            }
384
        }
385
        return false;
386
    }
387

    
388
    public void setActiveComposer(JScriptingComposer composer) {
389
        this.activeComposer = composer;
390
    }
391
    
392
    @Override
393
    public JScriptingComposer getActiveComposer() {
394
        return this.activeComposer;
395
    }
396

    
397
    @Override
398
    public void registerEditor(EditorFactory factory) {
399
        this.editorFactories.put(factory.getName(), factory);
400
        this.editorFactoriesOrderer = null;
401
    }
402
    
403
    @Override
404
    public List<EditorFactory> getEditorFactories() {
405
        if( this.editorFactoriesOrderer == null ) {
406
            this.editorFactoriesOrderer = new ArrayList<>(this.editorFactories.values());
407
            Collections.sort(editorFactoriesOrderer, new Comparator<EditorFactory>() {
408

    
409
                @Override
410
                public int compare(EditorFactory o1, EditorFactory o2) {
411
                    return o2.getPriority() - o1.getPriority();
412
                }
413
            });
414
        }
415
        return editorFactoriesOrderer;
416
    }
417

    
418
    @Override
419
    public ScriptChooserPanel createScriptChooserPanel() {
420
        return new DefaultScriptChooserPanel(this);
421
    }
422

    
423
    @Override
424
    public PickerController<Script> createScriptPickerController(JTextField text, JButton chooser) {
425
        ScriptPickerController x = new ScriptPickerController(text, chooser);
426
        return x;
427
    }
428

    
429
    @Override
430
    public PickerController<List<Script>> createListScriptPickerController(JComboBox combo, JButton remove, JButton chooser) {
431
        ScriptListPickerController x = new ScriptListPickerController(combo, remove, chooser);
432
        return x;
433
    }
434
}