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

History | View | Annotate | Download (12.6 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.Collection;
8
import java.util.HashMap;
9
import java.util.HashSet;
10
import java.util.Locale;
11
import java.util.Map;
12
import java.util.Set;
13
import javax.help.HelpSet;
14
import javax.help.HelpSetException;
15
import javax.help.JHelp;
16
import javax.help.ScriptingHelpModel;
17
import javax.swing.Action;
18
import javax.swing.ImageIcon;
19
import javax.swing.JComponent;
20
import javax.swing.JPanel;
21
import org.gvsig.about.AboutLocator;
22
import org.gvsig.about.AboutManager;
23
import org.gvsig.scripting.ScriptingDialog;
24
import org.gvsig.scripting.ScriptingFolder;
25
import org.gvsig.scripting.ScriptingHelpManager;
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.JCodeEditor;
31
import org.gvsig.scripting.swing.api.JDialogEditor;
32
import org.gvsig.scripting.swing.api.JEditor;
33
import org.gvsig.scripting.swing.api.JScriptingBrowser;
34
import org.gvsig.scripting.swing.api.JScriptingComposer;
35
import org.gvsig.scripting.swing.api.JScriptingConsole;
36
import org.gvsig.scripting.swing.api.JScriptingLauncher;
37
import org.gvsig.scripting.swing.api.JThinG;
38
import org.gvsig.scripting.swing.api.JThinlet;
39
import org.gvsig.scripting.swing.api.ScriptingUIManager;
40
import org.gvsig.scripting.swing.api.SyntaxtHighlightTextComponent;
41
import org.gvsig.scripting.swing.impl.composer.DefaultJCodeEditor;
42
import org.gvsig.scripting.swing.impl.composer.DefaultJDialogEditor;
43
import org.gvsig.scripting.swing.impl.composer.DefaultJScriptingComposer;
44
import org.gvsig.scripting.swing.impl.syntaxhighlight.JEditorPaneSyntaxHighlighting;
45
import org.gvsig.scripting.swing.impl.syntaxhighlight.JRSyntaxTextArea;
46
import org.gvsig.tools.ToolsLocator;
47
import org.gvsig.tools.i18n.I18nManager;
48
import org.gvsig.tools.swing.api.Component;
49
import org.gvsig.tools.swing.api.ToolsSwingLocator;
50
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
51
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
52
import org.slf4j.Logger;
53
import org.slf4j.LoggerFactory;
54

    
55
public class DefaultScriptingUIManager implements ScriptingUIManager {
56

    
57
    private final static Logger logger = LoggerFactory.getLogger(DefaultScriptingUIManager.class);
58
    
59
    private final ScriptingManager manager;
60
    private final Map<String, URL> userHelps = new HashMap<>();
61
    private I18nManager i18nManager;
62
    private WindowManager windowsManager = null;
63
    private final Map<String,Action> composerTools = new HashMap<>();
64
    private final Map<String,MenuEntry> composerMenus = new HashMap<>();
65
    private JScriptingComposer activeComposer;
66
    private Set<CreateComponentListener> createComponentListeners;
67
    
68
    private static class DefaultMenuEntry implements MenuEntry {
69
        private final Action action;
70
        private final String text;
71

    
72
        public DefaultMenuEntry(String text, Action action) {
73
            this.text = text;
74
            this.action = action;
75
        }
76

    
77
        @Override
78
        public String getText() {
79
            return this.text;
80
        }
81

    
82
        @Override
83
        public Action getAction() {
84
            return this.action;
85
        }
86
        
87
    }
88
    public DefaultScriptingUIManager() {
89

    
90
        this.manager = ScriptingLocator.getManager();
91
        this.manager.put("ScriptingUIManager", this);
92
        
93
        this.i18nManager = ToolsLocator.getI18nManager();
94
    }
95
    
96
    @Override
97
    public void addCreatedComponentListener(CreateComponentListener listener) {
98
        if( this.createComponentListeners==null ) {
99
            this.createComponentListeners = new HashSet<>();
100
        }
101
        this.createComponentListeners.add(listener);
102
    }
103
    
104
    @Override
105
    public void removeCreatedComponentListener(CreateComponentListener listener) {
106
        if( this.createComponentListeners==null ) {
107
            return;
108
        }
109
        this.createComponentListeners.remove(listener);
110
    }
111
    
112
    public void fireCreateComponent(Component component) {
113
        if (this.createComponentListeners == null) {
114
            return;
115
        }
116
        for (ScriptingUIManager.CreateComponentListener listener : this.createComponentListeners) {
117
            try {
118
                listener.componentCreated(component);
119
            } catch (Throwable th) {
120

    
121
            }
122
        }
123
    }
124
    
125
    @Override
126
    public JScriptingComposer createComposer() {
127
        JScriptingComposer composer = new DefaultJScriptingComposer(this);
128
        fireCreateComponent(composer);
129
        return composer;
130
    }
131

    
132
    @Override
133
    public JPanel createInstaller() {
134
        // TODO Auto-generated method stub
135
        return null;
136
    }
137

    
138
    @Override
139
    public JScriptingLauncher createLauncher() {
140
        JScriptingLauncher launcher = new DefaultJScriptingLauncher(this);
141
        fireCreateComponent(launcher);
142
        return launcher;
143
    }
144

    
145
    @Override
146
    public ImageIcon getIcon(String name) {
147
        return this.getIcon(name, null);
148
    }
149

    
150
    @Override
151
    public ImageIcon getIcon(String name, String size) {
152
        if (name == null) {
153
            return new ImageIcon();
154
        }
155
        String tamanyo = "16x16/";
156
        if (size != null && size.equals("big")) {
157
            tamanyo = "32x32/";
158
        }
159
        ClassLoader loader = this.getClass().getClassLoader();
160
        URL url = loader.getResource("org/gvsig/scripting/images/" + tamanyo + name + ".png");
161
        if (url == null) {
162
            url = loader.getResource("org/gvsig/scripting/images/" + tamanyo + "image-missing.png");
163
        }
164
        if (url == null) {
165
            return new ImageIcon();
166
        }
167
        return new ImageIcon(url);
168
    }
169

    
170
    @Override
171
    public ScriptingManager getManager() {
172
        return this.manager;
173
    }
174

    
175
    @Override
176
    public JPanel getHelp() {
177
        JPanel panel = new JPanel();
178
        panel.setLayout(new BorderLayout());
179
        ScriptingHelpManager helpManager = this.getManager().getHelpManager();
180
        HelpSet hs = helpManager.getHelpSet();
181
        JHelp jhelp = new JHelp(
182
                new ScriptingHelpModel(hs, helpManager),
183
                null,
184
                hs.getDefaultPresentation()
185
        );
186
        panel.add(jhelp, BorderLayout.CENTER);
187
        panel.setPreferredSize(new Dimension(800, 600));
188
        return panel;
189
    }
190

    
191
    public String[] getPrerreferedLanguages() {
192
        String curr = Locale.getDefault().getLanguage().toLowerCase();
193
        if (curr.equals("gl")) {
194
            return new String[]{"gl", "es", "en"};
195
        }
196
        if (curr.equals("ca")) {
197
            return new String[]{"ca", "es", "en"};
198
        }
199
        if (curr.equals("eu")) {
200
            return new String[]{"eu", "es", "en"};
201
        }
202
        if (curr.equals("va")) {
203
            return new String[]{"va", "ca", "es", "en"};
204
        }
205
        return new String[]{curr, "en", "es"};
206
    }
207

    
208
    @Override
209
    public JPanel getUserHelp() {
210
        String[] langs = this.getPrerreferedLanguages();
211
        URL url = null;
212
        for (String lang : langs) {
213
            url = this.userHelps.get(lang);
214
            if (url != null) {
215
                break;
216
            }
217
        }
218

    
219
        if (url == null) {
220
            logger.warn("Can't have help");
221
            return null;
222
        }
223

    
224
        URL[] urls = new URL[1];
225
        urls[0] = url;
226
        ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader());
227

    
228
        HelpSet helpSet;
229
        try {
230
            URL resource;
231
            resource = loader.getResource("org/gvsig/scripting/help/help.hs");
232

    
233
            helpSet = new HelpSet(loader, resource);
234
        } catch (HelpSetException e) {
235
            logger.warn("Can't load helpset '" + url.toString() + "'.", e);
236
            return null;
237
        }
238

    
239
        JPanel panel = new JPanel();
240
        panel.setLayout(new BorderLayout());
241
        panel.add(new JHelp(helpSet), BorderLayout.CENTER);
242
        panel.setPreferredSize(new Dimension(800, 600));
243
        return panel;
244

    
245
    }
246

    
247
    @Override
248
    public void addUserHelp(String langName, URL resource) {
249
        this.userHelps.put(langName.toLowerCase(), resource);
250
    }
251

    
252
    @Override
253
    public AboutManager getAboutManager() {
254
        return AboutLocator.getManager();
255
    }
256

    
257
    private void showWindow(JComponent panel, String title, WindowManager.MODE mode) {
258
        WindowManager winmanager = this.getWindowManager();
259
        if( winmanager instanceof WindowManager_v2 ) {
260
            ((WindowManager_v2)winmanager).showWindow(panel, title, mode, getIcon("scripting_python").getImage());
261
        } else {
262
            winmanager.showWindow(panel, title, mode);
263
        }
264
    }
265
    
266
    @Override
267
    public void showDialog(JComponent panel, String title) {
268
        this.showWindow(panel, title, WindowManager.MODE.DIALOG);
269
    }
270

    
271
    @Override
272
    public void showWindow(JComponent panel, String title) {
273
        this.showWindow(panel, title, WindowManager.MODE.WINDOW);
274
    }
275

    
276
    @Override
277
    public void showTool(JComponent panel, String title) {
278
        this.showWindow(panel, title, WindowManager.MODE.TOOL);
279
    }
280

    
281
    @Override
282
    public JScriptingBrowser createBrowser(ScriptingFolder root, boolean foldersOnly) {
283
        JScriptingBrowser browser = new DefaultJScriptingBrowser(this, root, foldersOnly);
284
        fireCreateComponent(browser);
285
        return browser;
286
    }
287

    
288
    @Override
289
    public JScriptingBrowser createBrowser(ScriptingFolder root) {
290
        return this.createBrowser(root,false);
291
    }
292

    
293
    @Override
294
    public JCodeEditor createJCodeEditor(ScriptingScript script) {
295
        JCodeEditor editor = new DefaultJCodeEditor(this, script);
296
        fireCreateComponent(editor);
297
        return editor;
298
    }
299

    
300
    @Override
301
    public JDialogEditor createJDialogEditor(ScriptingDialog script) {
302
        return new DefaultJDialogEditor(this, script);
303
    }
304

    
305
    @Override
306
    public JThinG createJThinG() {
307
        JThinG thing = new DefaultJThinG();
308
        return thing;
309
    }
310

    
311
    @Override
312
    public JThinlet createJThinlet() {
313
        JThinlet thinlet = new DefaultJThinlet();
314
        return thinlet;
315
    }
316

    
317
    @Override
318
    public SyntaxtHighlightTextComponent createSyntaxHighlightingPanel() {
319
        try {
320
            return new JRSyntaxTextArea();
321
        } catch (Throwable t) {
322
            logger.info("Can't create advanced SyntaxHighlightingPanel.", t);
323
            return new JEditorPaneSyntaxHighlighting();
324
        }
325
    }
326

    
327
    @Override
328
    public String getTranslation(String key) {
329
        if (this.i18nManager == null) {
330
            this.i18nManager = ToolsLocator.getI18nManager();
331
        }
332
        return i18nManager.getTranslation(key);
333
    }
334

    
335
    @Override
336
    public WindowManager getWindowManager() {
337
        if( this.windowsManager==null ) {
338
            this.windowsManager = ToolsSwingLocator.getWindowManager();
339
        }
340
        return this.windowsManager;
341
    }
342

    
343
    @Override
344
    public void setWindowManager(WindowManager windowsManager) {
345
        this.windowsManager = windowsManager;
346
    }
347

    
348
    @Override
349
    public JScriptingConsole createJScriptingConsole() {
350
        return this.createJScriptingConsole(true);
351
    }
352

    
353
    @Override
354
    public JScriptingConsole createJScriptingConsole(boolean captureOutput) {
355
        JScriptingConsole console = new DefaultJScriptingConsole(captureOutput);
356
        fireCreateComponent(console);
357
        return console;
358
    }
359

    
360
    @Override
361
    public void addComposerMenu(String text, Action action) {
362
        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
363
        this.composerMenus.put(name,new DefaultMenuEntry(text,action));
364
    }
365

    
366
    @Override
367
    public void addComposerTool(Action action) {
368
        String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
369
        this.composerTools.put(name,action);
370
    }
371

    
372
    @Override
373
    public Collection<MenuEntry> getComposerMenus() {
374
        return this.composerMenus.values();
375
    }
376

    
377
    @Override
378
    public Collection<Action> getComposerTools() {
379
        return this.composerTools.values();
380
    }
381
    
382
    @Override
383
    public JEditor createEditor(ScriptingUnit unit) {
384
        JEditor editor;
385
        if( unit instanceof ScriptingDialog ) {
386
            editor = new DefaultJDialogEditor(this, (ScriptingDialog) unit);
387
        } else  if( unit instanceof ScriptingScript ) {
388
            editor = new DefaultJCodeEditor(this, (ScriptingScript) unit);
389
        } else {
390
            return null;
391
        }
392
        fireCreateComponent(editor);
393
        return editor;
394
    }
395

    
396
    public void setActiveComposer(JScriptingComposer composer) {
397
        this.activeComposer = composer;
398
    }
399
    
400
    @Override
401
    public JScriptingComposer getActiveComposer() {
402
        return this.activeComposer;
403
    }
404
    
405
}