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 @ 763

History | View | Annotate | Download (14.9 KB)

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

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

    
66
public class DefaultScriptingUIManager implements ScriptingUIManager {
67

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

    
85
        public DefaultMenuEntry(String text, Action action) {
86
            this.text = text;
87
            this.action = action;
88
        }
89

    
90
        @Override
91
        public String getText() {
92
            return this.text;
93
        }
94

    
95
        @Override
96
        public Action getAction() {
97
            return this.action;
98
        }
99
        
100
    }
101
    public DefaultScriptingUIManager() {
102

    
103
        this.manager = ScriptingLocator.getManager();
104
        this.manager.put("ScriptingUIManager", this);
105
        
106
        this.i18nManager = ToolsLocator.getI18nManager();
107
        
108
        this.registerEditor(new DialogEditorFactory());
109
        this.registerEditor(new ScriptEditorFactory());
110
        this.registerEditor(new TextEditorFactory());
111
        this.registerEditor(new ExternalFileEditorFactory());
112
    }
113
    
114
    @Override
115
    public void addCreatedComponentListener(CreateComponentListener listener) {
116
        if( this.createComponentListeners==null ) {
117
            this.createComponentListeners = new HashSet<>();
118
        }
119
        this.createComponentListeners.add(listener);
120
    }
121
    
122
    @Override
123
    public void removeCreatedComponentListener(CreateComponentListener listener) {
124
        if( this.createComponentListeners==null ) {
125
            return;
126
        }
127
        this.createComponentListeners.remove(listener);
128
    }
129
    
130
    public void fireCreateComponent(Component component) {
131
        if (this.createComponentListeners == null) {
132
            return;
133
        }
134
        for (CreateComponentListener listener : this.createComponentListeners) {
135
            try {
136
                listener.componentCreated(component);
137
            } catch (Throwable th) {
138

    
139
            }
140
        }
141
    }
142
    
143
    @Override
144
    public JScriptingComposer createComposer() {
145
        JScriptingComposer composer = new DefaultJScriptingComposer(this);
146
        fireCreateComponent(composer);
147
        return composer;
148
    }
149

    
150
    @Override
151
    public JPanel createInstaller() {
152
        // TODO Auto-generated method stub
153
        return null;
154
    }
155

    
156
    @Override
157
    public JScriptingLauncher createLauncher() {
158
        JScriptingLauncher launcher = new DefaultJScriptingLauncher(this);
159
        fireCreateComponent(launcher);
160
        return launcher;
161
    }
162

    
163
    @Override
164
    public ImageIcon getIcon(String name) {
165
        return this.getIcon(name, null);
166
    }
167

    
168
    @Override
169
    public ImageIcon getIcon(String name, String size) {
170
        if (name == null) {
171
            return new ImageIcon();
172
        }
173
        String tamanyo = "16x16/";
174
        if (size != null && size.equals("big")) {
175
            tamanyo = "32x32/";
176
        }
177
        ClassLoader loader = this.getClass().getClassLoader();
178
        URL url = loader.getResource("org/gvsig/scripting/images/" + tamanyo + name + ".png");
179
        if (url == null) {
180
            url = loader.getResource("org/gvsig/scripting/images/" + tamanyo + "image-missing.png");
181
        }
182
        if (url == null) {
183
            return new ImageIcon();
184
        }
185
        return new ImageIcon(url);
186
    }
187

    
188
    @Override
189
    public ScriptingManager getManager() {
190
        return this.manager;
191
    }
192

    
193
    @Override
194
    public JPanel getHelp() {
195
        JPanel panel = new JPanel();
196
        panel.setLayout(new BorderLayout());
197
        ScriptingHelpManager helpManager = this.getManager().getHelpManager();
198
        HelpSet hs = helpManager.getHelpSet();
199
        JHelp jhelp = new JHelp(
200
                new ScriptingHelpModel(hs, helpManager),
201
                null,
202
                hs.getDefaultPresentation()
203
        );
204
        panel.add(jhelp, BorderLayout.CENTER);
205
        panel.setPreferredSize(new Dimension(800, 600));
206
        return panel;
207
    }
208

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

    
226
    @Override
227
    public JPanel getUserHelp() {
228
        String[] langs = this.getPrerreferedLanguages();
229
        URL url = null;
230
        for (String lang : langs) {
231
            url = this.userHelps.get(lang);
232
            if (url != null) {
233
                break;
234
            }
235
        }
236

    
237
        if (url == null) {
238
            logger.warn("Can't have help");
239
            return null;
240
        }
241

    
242
        URL[] urls = new URL[1];
243
        urls[0] = url;
244
        ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader());
245

    
246
        HelpSet helpSet;
247
        try {
248
            URL resource;
249
            resource = loader.getResource("org/gvsig/scripting/help/help.hs");
250

    
251
            helpSet = new HelpSet(loader, resource);
252
        } catch (HelpSetException e) {
253
            logger.warn("Can't load helpset '" + url.toString() + "'.", e);
254
            return null;
255
        }
256

    
257
        JPanel panel = new JPanel();
258
        panel.setLayout(new BorderLayout());
259
        panel.add(new JHelp(helpSet), BorderLayout.CENTER);
260
        panel.setPreferredSize(new Dimension(800, 600));
261
        return panel;
262

    
263
    }
264

    
265
    @Override
266
    public void addUserHelp(String langName, URL resource) {
267
        this.userHelps.put(langName.toLowerCase(), resource);
268
    }
269

    
270
    @Override
271
    public AboutManager getAboutManager() {
272
        return AboutLocator.getManager();
273
    }
274

    
275
    private void showWindow(JComponent panel, String title, WindowManager.MODE mode) {
276
        WindowManager winmanager = this.getWindowManager();
277
        if( winmanager instanceof WindowManager_v2 ) {
278
            ((WindowManager_v2)winmanager).showWindow(panel, title, mode, getIcon("scripting_python").getImage());
279
        } else {
280
            winmanager.showWindow(panel, title, mode);
281
        }
282
    }
283
    
284
    @Override
285
    public void showDialog(JComponent panel, String title) {
286
        this.showWindow(panel, title, WindowManager.MODE.DIALOG);
287
    }
288

    
289
    @Override
290
    public void showWindow(JComponent panel, String title) {
291
        this.showWindow(panel, title, WindowManager.MODE.WINDOW);
292
    }
293

    
294
    @Override
295
    public void showTool(JComponent panel, String title) {
296
        this.showWindow(panel, title, WindowManager.MODE.TOOL);
297
    }
298

    
299
    @Override
300
    public JScriptingBrowser createBrowser(ScriptingFolder root, boolean foldersOnly) {
301
        JScriptingBrowser browser = new DefaultJScriptingBrowser(this, root, foldersOnly);
302
        fireCreateComponent(browser);
303
        return browser;
304
    }
305

    
306
    @Override
307
    public JScriptingBrowser createBrowser(ScriptingFolder root) {
308
        return this.createBrowser(root,false);
309
    }
310

    
311
    @Override
312
    public JCodeEditor createJCodeEditor(ScriptingScript script) {
313
        JCodeEditor editor = new ScriptEditor(this, script);
314
        fireCreateComponent(editor);
315
        return editor;
316
    }
317

    
318
    @Override
319
    public JDialogEditor createJDialogEditor(ScriptingDialog script) {
320
        return new DialogEditor(this, script);
321
    }
322

    
323
    @Override
324
    public JThinG createJThinG() {
325
        JThinG thing = new DefaultJThinG();
326
        return thing;
327
    }
328

    
329
    @Override
330
    public JThinlet createJThinlet() {
331
        JThinlet thinlet = new DefaultJThinlet();
332
        return thinlet;
333
    }
334

    
335
    @Override
336
    public SyntaxtHighlightTextComponent createSyntaxHighlightingPanel() {
337
        try {
338
            return new JRSyntaxTextArea();
339
        } catch (Throwable t) {
340
            logger.info("Can't create advanced SyntaxHighlightingPanel.", t);
341
            return new JEditorPaneSyntaxHighlighting();
342
        }
343
    }
344

    
345
    @Override
346
    public String getTranslation(String key) {
347
        if (this.i18nManager == null) {
348
            this.i18nManager = ToolsLocator.getI18nManager();
349
        }
350
        return i18nManager.getTranslation(key);
351
    }
352

    
353
    @Override
354
    public WindowManager getWindowManager() {
355
        if( this.windowsManager==null ) {
356
            this.windowsManager = ToolsSwingLocator.getWindowManager();
357
        }
358
        return this.windowsManager;
359
    }
360

    
361
    @Override
362
    public void setWindowManager(WindowManager windowsManager) {
363
        this.windowsManager = windowsManager;
364
    }
365

    
366
    @Override
367
    public JScriptingConsole createJScriptingConsole() {
368
        return this.createJScriptingConsole(true);
369
    }
370

    
371
    @Override
372
    public JScriptingConsole createJScriptingConsole(boolean captureOutput) {
373
        JScriptingConsole console = new DefaultJScriptingConsole(captureOutput);
374
        fireCreateComponent(console);
375
        return console;
376
    }
377

    
378
    @Override
379
    public void addComposerMenu(String text, Action action) {
380
        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
381
        this.composerMenus.put(name,new DefaultMenuEntry(text,action));
382
    }
383

    
384
    @Override
385
    public void addComposerTool(Action action) {
386
        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
387
        this.composerTools.put(name,action);
388
    }
389

    
390
    @Override
391
    public Collection<MenuEntry> getComposerMenus() {
392
        return this.composerMenus.values();
393
    }
394

    
395
    @Override
396
    public Collection<Action> getComposerTools() {
397
        return this.composerTools.values();
398
    }
399
    
400
    @Override
401
    public JEditor createEditor(ScriptingUnit unit) {
402
        JEditor editor = null;
403
        for (EditorFactory factory : this.getEditorFactories() ) {
404
            try {
405
                if( factory.canCreate(unit) ) {
406
                    editor = factory.create(unit);
407
                    fireCreateComponent(editor);
408
                    break;
409
                }
410
            } catch(Exception ex) {
411
                logger.warn("Can't create an editor with factory '"+factory.getClass().getName()+"' for '"+unit.getClass().getName()+"'.",ex);
412
            }
413
        }
414
        return editor;
415
    }
416

    
417
    @Override
418
    public boolean hasEditor(ScriptingUnit unit) {
419
        if( unit == null ) {
420
            return false;
421
        }
422
        for (EditorFactory factory : this.getEditorFactories() ) {
423
            try {
424
                if( factory.canCreate(unit) ) {
425
                    return true;
426
                }
427
            } catch(Exception ex) {
428
                logger.warn("Can't check if factory '"+factory.getClass().getName()+"' can create an editor for '"+unit.getClass().getName()+"'.",ex);
429
            }
430
        }
431
        return false;
432
    }
433

    
434
    public void setActiveComposer(JScriptingComposer composer) {
435
        this.activeComposer = composer;
436
    }
437
    
438
    @Override
439
    public JScriptingComposer getActiveComposer() {
440
        return this.activeComposer;
441
    }
442

    
443
    @Override
444
    public void registerEditor(EditorFactory factory) {
445
        this.editorFactories.put(factory.getName(), factory);
446
        this.editorFactoriesOrderer = null;
447
    }
448
    
449
    @Override
450
    public List<EditorFactory> getEditorFactories() {
451
        if( this.editorFactoriesOrderer == null ) {
452
            this.editorFactoriesOrderer = new ArrayList<>(this.editorFactories.values());
453
            Collections.sort(editorFactoriesOrderer, new Comparator<EditorFactory>() {
454

    
455
                @Override
456
                public int compare(EditorFactory o1, EditorFactory o2) {
457
                    return o2.getPriority() - o1.getPriority();
458
                }
459
            });
460
        }
461
        return editorFactoriesOrderer;
462
    }
463
}