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

History | View | Annotate | Download (15.3 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.PropertiesEditorFactory;
53
import org.gvsig.scripting.swing.impl.composer.editors.ScriptEditor;
54
import org.gvsig.scripting.swing.impl.composer.editors.ScriptEditorFactory;
55
import org.gvsig.scripting.swing.impl.composer.editors.TextEditorFactory;
56
import org.gvsig.scripting.swing.impl.syntaxhighlight.JEditorPaneSyntaxHighlighting;
57
import org.gvsig.scripting.swing.impl.syntaxhighlight.JRSyntaxTextArea;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.i18n.I18nManager;
60
import org.gvsig.tools.swing.api.Component;
61
import org.gvsig.tools.swing.api.ToolsSwingLocator;
62
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
63
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
64
import org.slf4j.Logger;
65
import org.slf4j.LoggerFactory;
66

    
67
public class DefaultScriptingUIManager implements ScriptingUIManager {
68

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

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

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

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

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

    
157
    @Override
158
    public JPanel createInstaller() {
159
        // TODO Auto-generated method stub
160
        return null;
161
    }
162

    
163
    @Override
164
    public JScriptingLauncher createLauncher() {
165
        JScriptingLauncher launcher = new DefaultJScriptingLauncher(this);
166
        fireCreateComponent(launcher);
167
        return launcher;
168
    }
169

    
170
    @Override
171
    public ImageIcon getIcon(String name) {
172
        return this.getIcon(name, null);
173
    }
174

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

    
195
    @Override
196
    public ScriptingManager getManager() {
197
        return this.manager;
198
    }
199

    
200
    @Override
201
    public JPanel getHelp() {
202
        JPanel panel = new JPanel();
203
        panel.setLayout(new BorderLayout());
204
        ScriptingHelpManager helpManager = this.getManager().getHelpManager();
205
        HelpSet hs = helpManager.getHelpSet();
206
        JHelp jhelp = new JHelp(
207
                new ScriptingHelpModel(hs, helpManager),
208
                null,
209
                hs.getDefaultPresentation()
210
        );
211
        panel.add(jhelp, BorderLayout.CENTER);
212
        panel.setPreferredSize(new Dimension(800, 600));
213
        return panel;
214
    }
215

    
216
    public String[] getPrerreferedLanguages() {
217
        String curr = Locale.getDefault().getLanguage().toLowerCase();
218
        if (curr.equals("gl")) {
219
            return new String[]{"gl", "es", "en"};
220
        }
221
        if (curr.equals("ca")) {
222
            return new String[]{"ca", "es", "en"};
223
        }
224
        if (curr.equals("eu")) {
225
            return new String[]{"eu", "es", "en"};
226
        }
227
        if (curr.equals("va")) {
228
            return new String[]{"va", "ca", "es", "en"};
229
        }
230
        return new String[]{curr, "en", "es"};
231
    }
232

    
233
    @Override
234
    public JPanel getUserHelp() {
235
        String[] langs = this.getPrerreferedLanguages();
236
        URL url = null;
237
        for (String lang : langs) {
238
            url = this.userHelps.get(lang);
239
            if (url != null) {
240
                break;
241
            }
242
        }
243

    
244
        if (url == null) {
245
            logger.warn("Can't have help");
246
            return null;
247
        }
248

    
249
        URL[] urls = new URL[1];
250
        urls[0] = url;
251
        ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader());
252

    
253
        HelpSet helpSet;
254
        try {
255
            URL resource;
256
            resource = loader.getResource("org/gvsig/scripting/help/help.hs");
257

    
258
            helpSet = new HelpSet(loader, resource);
259
        } catch (HelpSetException e) {
260
            logger.warn("Can't load helpset '" + url.toString() + "'.", e);
261
            return null;
262
        }
263

    
264
        JPanel panel = new JPanel();
265
        panel.setLayout(new BorderLayout());
266
        panel.add(new JHelp(helpSet), BorderLayout.CENTER);
267
        panel.setPreferredSize(new Dimension(800, 600));
268
        return panel;
269

    
270
    }
271

    
272
    @Override
273
    public void addUserHelp(String langName, URL resource) {
274
        this.userHelps.put(langName.toLowerCase(), resource);
275
    }
276

    
277
    @Override
278
    public AboutManager getAboutManager() {
279
        return AboutLocator.getManager();
280
    }
281

    
282
    private void showWindow(JComponent panel, String title, WindowManager.MODE mode) {
283
        WindowManager winmanager = this.getWindowManager();
284
        if( winmanager instanceof WindowManager_v2 ) {
285
            ((WindowManager_v2)winmanager).showWindow(panel, title, mode, getIcon("scripting_python").getImage());
286
        } else {
287
            winmanager.showWindow(panel, title, mode);
288
        }
289
    }
290
    
291
    @Override
292
    public void showDialog(JComponent panel, String title) {
293
        this.showWindow(panel, title, WindowManager.MODE.DIALOG);
294
    }
295

    
296
    @Override
297
    public void showWindow(JComponent panel, String title) {
298
        this.showWindow(panel, title, WindowManager.MODE.WINDOW);
299
    }
300

    
301
    @Override
302
    public void showTool(JComponent panel, String title) {
303
        this.showWindow(panel, title, WindowManager.MODE.TOOL);
304
    }
305

    
306
    @Override
307
    public JScriptingBrowser createBrowser(ScriptingFolder root, boolean foldersOnly) {
308
        JScriptingBrowser browser = new DefaultJScriptingBrowser(this, root, foldersOnly);
309
        fireCreateComponent(browser);
310
        return browser;
311
    }
312

    
313
    @Override
314
    public JScriptingBrowser createBrowser(ScriptingFolder root) {
315
        return this.createBrowser(root,false);
316
    }
317

    
318
    @Override
319
    public JCodeEditor createJCodeEditor(ScriptingScript script) {
320
        JCodeEditor editor = new ScriptEditor(this, script);
321
        fireCreateComponent(editor);
322
        return editor;
323
    }
324

    
325
    @Override
326
    public JDialogEditor createJDialogEditor(ScriptingDialog script) {
327
        return new DialogEditor(this, script);
328
    }
329

    
330
    @Override
331
    public JThinG createJThinG() {
332
        JThinG thing = new DefaultJThinG();
333
        return thing;
334
    }
335

    
336
    @Override
337
    public JThinlet createJThinlet() {
338
        JThinlet thinlet = new DefaultJThinlet();
339
        return thinlet;
340
    }
341

    
342
    @Override
343
    public SyntaxtHighlightTextComponent createSyntaxHighlightingPanel() {
344
        try {
345
            return new JRSyntaxTextArea();
346
        } catch (Throwable t) {
347
            logger.info("Can't create advanced SyntaxHighlightingPanel.", t);
348
            return new JEditorPaneSyntaxHighlighting();
349
        }
350
    }
351

    
352
    @Override
353
    public String getTranslation(String key) {
354
        if (this.i18nManager == null) {
355
            this.i18nManager = ToolsLocator.getI18nManager();
356
        }
357
        return i18nManager.getTranslation(key);
358
    }
359

    
360
    @Override
361
    public WindowManager getWindowManager() {
362
        if( this.windowsManager==null ) {
363
            this.windowsManager = ToolsSwingLocator.getWindowManager();
364
        }
365
        return this.windowsManager;
366
    }
367

    
368
    @Override
369
    public void setWindowManager(WindowManager windowsManager) {
370
        this.windowsManager = windowsManager;
371
    }
372

    
373
    @Override
374
    public JScriptingConsole createJScriptingConsole() {
375
        return this.createJScriptingConsole(true);
376
    }
377

    
378
    @Override
379
    public JScriptingConsole createJScriptingConsole(boolean captureOutput) {
380
        JScriptingConsole console = new DefaultJScriptingConsole(captureOutput);
381
        fireCreateComponent(console);
382
        return console;
383
    }
384

    
385
    @Override
386
    public void addComposerMenu(String text, Action action) {
387
        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
388
        this.composerMenus.put(name,new DefaultMenuEntry(text,action));
389
    }
390

    
391
    @Override
392
    public void addComposerTool(Action action) {
393
        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
394
        this.composerTools.put(name,action);
395
    }
396

    
397
    @Override
398
    public Collection<MenuEntry> getComposerMenus() {
399
        return this.composerMenus.values();
400
    }
401

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

    
424
    @Override
425
    public boolean hasEditor(ScriptingUnit unit) {
426
        if( unit == null ) {
427
            return false;
428
        }
429
        for (EditorFactory factory : this.getEditorFactories() ) {
430
            try {
431
                if( factory.canCreate(unit) ) {
432
                    return true;
433
                }
434
            } catch(Exception ex) {
435
                logger.warn("Can't check if factory '"+factory.getClass().getName()+"' can create an editor for '"+unit.getClass().getName()+"'.",ex);
436
            }
437
        }
438
        return false;
439
    }
440

    
441
    public void setActiveComposer(JScriptingComposer composer) {
442
        this.activeComposer = composer;
443
    }
444
    
445
    @Override
446
    public JScriptingComposer getActiveComposer() {
447
        return this.activeComposer;
448
    }
449

    
450
    @Override
451
    public void registerEditor(EditorFactory factory) {
452
        this.editorFactories.put(factory.getName(), factory);
453
        this.editorFactoriesOrderer = null;
454
    }
455
    
456
    @Override
457
    public List<EditorFactory> getEditorFactories() {
458
        if( this.editorFactoriesOrderer == null ) {
459
            this.editorFactoriesOrderer = new ArrayList<>(this.editorFactories.values());
460
            Collections.sort(editorFactoriesOrderer, new Comparator<EditorFactory>() {
461

    
462
                @Override
463
                public int compare(EditorFactory o1, EditorFactory o2) {
464
                    return o2.getPriority() - o1.getPriority();
465
                }
466
            });
467
        }
468
        return editorFactoriesOrderer;
469
    }
470
}