Statistics
| Revision:

svn-gvsig-desktop / tags / v1_0_RELEASE / frameworks / _fwAndami / src / com / iver / andami / PluginServices.java @ 9167

History | View | Annotate | Download (14.6 KB)

1 1104 fjp
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41 598 fernando
package com.iver.andami;
42
43
import java.awt.Component;
44 4419 azabala
import java.awt.Frame;
45 5828 fjp
import java.awt.KeyEventDispatcher;
46 8765 jjdelcerro
import java.awt.Toolkit;
47
import java.awt.datatransfer.DataFlavor;
48
import java.awt.datatransfer.StringSelection;
49
import java.awt.datatransfer.UnsupportedFlavorException;
50 598 fernando
import java.awt.event.ActionListener;
51 1141 fernando
import java.io.File;
52 8765 jjdelcerro
import java.io.IOException;
53 1141 fernando
import java.lang.reflect.InvocationTargetException;
54 8765 jjdelcerro
import java.util.HashMap;
55 735 vcaballero
import java.util.Iterator;
56 598 fernando
57 5817 fjp
import javax.swing.KeyStroke;
58 1141 fernando
import javax.swing.SwingUtilities;
59 4338 azabala
import javax.swing.Timer;
60 598 fernando
61 1153 fernando
import org.apache.log4j.Logger;
62 598 fernando
63 4358 ldiaz
import com.iver.andami.authentication.IAuthentication;
64 1153 fernando
import com.iver.andami.messages.Messages;
65
import com.iver.andami.messages.NotificationManager;
66 5275 jaume
import com.iver.andami.plugins.ExtensionDecorator;
67 5005 jorpiell
import com.iver.andami.plugins.IExtension;
68 1153 fernando
import com.iver.andami.plugins.PluginClassLoader;
69 5800 caballero
import com.iver.andami.preferences.DlgPreferences;
70 1153 fernando
import com.iver.andami.ui.mdiFrame.MDIFrame;
71
import com.iver.andami.ui.mdiFrame.MainFrame;
72
import com.iver.andami.ui.mdiManager.MDIManager;
73
import com.iver.utiles.XMLEntity;
74 4419 azabala
import com.iver.utiles.swing.threads.IMonitorableTask;
75
import com.iver.utiles.swing.threads.IProgressMonitorIF;
76 4338 azabala
import com.iver.utiles.swing.threads.TaskMonitorTimerListener;
77 4419 azabala
import com.iver.utiles.swing.threads.UndefinedProgressMonitor;
78 1153 fernando
79 598 fernando
/**
80 1141 fernando
 * Clase que proporciona servicios a los plugins.
81 5800 caballero
 *
82 1141 fernando
 * @author Fernando Gonz?lez Cort?s
83 598 fernando
 */
84
public class PluginServices {
85 4419 azabala
        private static Logger logger = Logger.getLogger(PluginServices.class
86
                        .getName());
87
88 3654 fjp
        private static String[] arguments;
89 4419 azabala
90 4361 ldiaz
        private static IAuthentication authentication;
91 4419 azabala
92 1141 fernando
        private PluginClassLoader loader;
93 4419 azabala
94 1141 fernando
        private XMLEntity persistentXML;
95 598 fernando
96 1141 fernando
        /**
97
         * Crea un nuevo PluginServices
98 5800 caballero
         *
99 4419 azabala
         * @param loader
100
         *            ClassLoader del plugin
101 1141 fernando
         */
102
        public PluginServices(PluginClassLoader loader) {
103
                this.loader = loader;
104
        }
105 598 fernando
106 1141 fernando
        /**
107
         * Devuelve el mensaje en el idioma del locale actual del texto
108
         * correspondiente a la clave que se pasa como par?metro
109 5800 caballero
         *
110 4419 azabala
         * @param key
111
         *            Clave del texto que se quiere obtener
112 5800 caballero
         *
113 1141 fernando
         * @return Texto en el idioma que toca o la propia clave si no se encuentra
114 4419 azabala
         *         en el fichero
115 1141 fernando
         */
116
        public String getText(String key) {
117 4517 cesar
                if (key == null) return null;
118 4732 cesar
                String translation = org.gvsig.i18n.Messages.getText(key, false);
119 6367 caballero
                if (translation != null)
120 4517 cesar
                        return translation;
121
                else
122
                {
123 8765 jjdelcerro
                        logger.warn("Plugin "+getPluginName()+" -- "+org.gvsig.i18n.Messages.getText("No_se_encontro_la_traduccion_para", false)+ " " + key);
124 1141 fernando
                        return key;
125
                }
126
        }
127 598 fernando
128 1141 fernando
        /**
129
         * Obtiene el classloader del plugin
130 5800 caballero
         *
131 1141 fernando
         * @return Returns the loader.
132
         */
133
        public PluginClassLoader getClassLoader() {
134
                return loader;
135
        }
136
137
        /**
138
         * Obtiene el nombre del plugin
139 5800 caballero
         *
140 1141 fernando
         * @return String
141
         */
142
        String getPluginName() {
143
                return loader.getPluginName();
144
        }
145
146
        /**
147
         * Obtienen una referencia al PluginServices del plugin cuyo nombre se pasa
148
         * como par?metro
149 5800 caballero
         *
150 4419 azabala
         * @param pluginClassInstance
151
         *            Instancia de una clase propia del plugin a cuyos servicios se
152
         *            quiere acceder
153 5800 caballero
         *
154 1141 fernando
         * @return Objeto PluginServices asociado al plugin
155 5800 caballero
         *
156 4419 azabala
         * @throws RuntimeException
157
         *             Si el par?metro no es un objeto cargado desde un plugin
158 1141 fernando
         */
159
        public static PluginServices getPluginServices(Object pluginClassInstance) {
160
                try {
161 4419 azabala
                        PluginClassLoader loader = (PluginClassLoader) pluginClassInstance
162
                                        .getClass().getClassLoader();
163 1141 fernando
164
                        return Launcher.getPluginServices(loader.getPluginName());
165
                } catch (ClassCastException e) {
166 4419 azabala
                        /*
167
                         * throw new RuntimeException( "Parameter is not a plugin class
168
                         * instance");
169
                         */
170
                        return null;
171 598 fernando
                }
172 1141 fernando
        }
173 598 fernando
174 1141 fernando
        /**
175
         * Obtienen una referencia al PluginServices del plugin cuyo nombre se pasa
176
         * como par?metro
177 5800 caballero
         *
178 4419 azabala
         * @param pluginName
179
         *            Instancia de una clase propia del plugin a cuyos servicios se
180
         *            quiere acceder
181 5800 caballero
         *
182 1141 fernando
         * @return Objeto PluginServices asociado al plugin
183
         */
184
        public static PluginServices getPluginServices(String pluginName) {
185
                return Launcher.getPluginServices(pluginName);
186
        }
187 598 fernando
188 1141 fernando
        /**
189
         * Obtiene una referencia al gestor de ventanas
190 5800 caballero
         *
191 1141 fernando
         * @return MDIManager
192
         */
193
        public static MDIManager getMDIManager() {
194
                return Launcher.getFrame().getMDIManager();
195
        }
196 598 fernando
197 1141 fernando
        /**
198 4419 azabala
         * Obtiene una referencia al marco principal de la aplicaci?n
199 5800 caballero
         *
200 1141 fernando
         * @return MainFrame
201
         */
202
        public static MainFrame getMainFrame() {
203
                return Launcher.getFrame();
204
        }
205 6367 caballero
206 5828 fjp
        public static void registerKeyStroke(KeyStroke key, KeyEventDispatcher a)
207 5817 fjp
        {
208
                GlobalKeyEventDispatcher.getInstance().registerKeyStroke(key, a);
209
        }
210 1141 fernando
211 5817 fjp
        public static void unRegisterKeyStroke(KeyStroke key)
212
        {
213
                GlobalKeyEventDispatcher.getInstance().removeKeyStrokeBinding(key);
214
        }
215
216 1141 fernando
        /**
217 4419 azabala
         * Obtiene una referencia a la instancia de la extensi?n cuya clase se pasa
218
         * como par?metro
219 5800 caballero
         *
220 4419 azabala
         * @param extensionClass
221
         *            Clase de la extensi?n cuya instancia se quiere obtener
222 5800 caballero
         *
223 4419 azabala
         * @return Instancia de la extensi?n o null en caso de que no haya una
224
         *         extensi?n con esa clase
225 1141 fernando
         */
226 5005 jorpiell
        public static IExtension getExtension(Class extensionClass) {
227 4419 azabala
                ExtensionDecorator extAux = (ExtensionDecorator) Launcher
228
                                .getClassesExtensions().get(extensionClass);
229
                return extAux.getExtension();
230
                // return (Extension)
231
                // Launcher.getClassesExtensions().get(extensionClass);
232
233 1141 fernando
        }
234
235
        /**
236 4419 azabala
         * Gets a reference to the Extension Decorator with support for several more
237
         * options
238 5800 caballero
         *
239 2862 jaume
         * @param extensionClass
240
         * @return
241
         */
242
        public static ExtensionDecorator getDecoratedExtension(Class extensionClass) {
243 4419 azabala
                return (ExtensionDecorator) Launcher.getClassesExtensions().get(
244
                                extensionClass);
245 2862 jaume
        }
246 4419 azabala
247 2862 jaume
        /**
248 8765 jjdelcerro
         * Returns an array containing references to all the loaded extensions.
249
         * @return ExtensionDecorator[]
250
         */
251
        public static ExtensionDecorator[] getDecoratedExtensions() {
252
                HashMap map = Launcher.getClassesExtensions();
253
                ExtensionDecorator[] extensions = (ExtensionDecorator[]) map.
254
                                values().toArray(new ExtensionDecorator[0]);
255
                return extensions;
256
        }
257
258
        /**
259 1141 fernando
         * Obtiene un iterador sobre las extensiones
260 5800 caballero
         *
261 1141 fernando
         * @return Iterator
262
         */
263
        public static Iterator getExtensions() {
264
                return Launcher.getClassesExtensions().values().iterator();
265
        }
266
267
        /**
268
         * Obtiene una traducci?n de un plugin
269 5800 caballero
         *
270 4419 azabala
         * @param pluginObject
271
         *            Objeto cargado desde un plugin
272
         * @param key
273
         *            Nombre de la clave cuyo valor se quiere obtener
274 5800 caballero
         *
275 4419 azabala
         * @return El valor, si existe. La clave si no existe. Si el objeto que se
276
         *         pasa como par?metro no ha sido cargado desde un plugin se
277
         *         devuelve la clave.
278 1141 fernando
         */
279
        public static String getText(Object pluginObject, String key) {
280 4517 cesar
                if (key == null) return null;
281 4732 cesar
                String translation = org.gvsig.i18n.Messages.getText(key, false);
282 6367 caballero
                if (translation != null)
283 4517 cesar
                        return translation;
284
                else
285
                {
286 8765 jjdelcerro
                        logger.warn(org.gvsig.i18n.Messages.getText("No_se_encontro_la_traduccion_para",false) + " "+ key);
287 1141 fernando
                        return key;
288 608 fjp
                }
289 1141 fernando
        }
290
291
        /**
292 4419 azabala
         * Establece los datos del plugin que deber?n persistir entre ejecuciones en
293
         * formato xml
294 5800 caballero
         *
295 4419 azabala
         * @param entity
296
         *            DOCUMENT ME!
297 1141 fernando
         */
298 1217 fernando
        public void setPersistentXML(XMLEntity entity) {
299 1141 fernando
                persistentXML = entity;
300
        }
301
302
        /**
303
         * Obtiene un objeto que representa la persistencia del plugin en formato
304 1217 fernando
         * xml.
305 5800 caballero
         *
306 1217 fernando
         * @return Devuelve null hasta que se invoca el m?todo setPersistentXML
307 1141 fernando
         */
308
        public XMLEntity getPersistentXML() {
309 4419 azabala
                if (persistentXML == null) {
310 1363 fernando
                        persistentXML = new XMLEntity();
311
                }
312 1141 fernando
                return persistentXML;
313
        }
314
315
        /**
316 4419 azabala
         * A?ade un listener a un popup menu registrado en el config.xml de alg?n
317
         * plugin
318 5800 caballero
         *
319 4419 azabala
         * @param name
320
         *            Nombre del men? contextual
321
         * @param c
322
         *            Componente que desplegar? el men? cuando se haga click con el
323
         *            bot?n derecho
324
         * @param listener
325
         *            Listener que se ejecutar? cuando se seleccione cualquier
326
         *            entrada del men?
327 5800 caballero
         *
328 4419 azabala
         * @throws RuntimeException
329
         *             Si la interfaz no est? preparada todav?a. S?lo puede darse
330
         *             durante el arranque
331 1141 fernando
         */
332
        public void addPopupMenuListener(String name, Component c,
333 4419 azabala
                        ActionListener listener) {
334 1141 fernando
                MDIFrame frame = Launcher.getFrame();
335
336
                if (frame == null) {
337
                        throw new RuntimeException("MDIFrame not loaded yet");
338 608 fjp
                }
339 598 fernando
340 1141 fernando
                frame.addPopupMenuListener(name, c, listener, loader);
341
        }
342 598 fernando
343 1141 fernando
        /**
344
         * Obtiene una referencia al directorio del plugin
345 5800 caballero
         *
346 1141 fernando
         * @return File
347
         */
348
        public File getPluginDirectory() {
349 4419 azabala
                return new File(Launcher.getPluginsDir() + File.separator
350
                                + getPluginName());
351 1141 fernando
        }
352 598 fernando
353 1141 fernando
        /**
354 4419 azabala
         * Ejecuta una tarea en segundo plano, dejando a la interfaz responder pero
355
         * inhibiendo los eventos
356 5800 caballero
         *
357 4419 azabala
         * @param r
358
         *            Tarea a ejecutar
359 5800 caballero
         *
360 1141 fernando
         * @return Thread en el que se ejecuta la tarea
361
         */
362
        public static Thread backgroundExecution(Runnable r) {
363
                Thread t = new Thread(new RunnableDecorator(r));
364
                t.start();
365 598 fernando
366 1141 fernando
                return t;
367
        }
368 4419 azabala
369
        /**
370
         * Runs a task in background. This task could be monitored and canceled, and
371
         * doesnt inhibed any event.
372 5800 caballero
         *
373 4419 azabala
         * @param task
374
         *            IMonitorableTask
375
         */
376
        public static void cancelableBackgroundExecution(final IMonitorableTask task) {
377 4338 azabala
                final com.iver.utiles.swing.threads.SwingWorker worker = new com.iver.utiles.swing.threads.SwingWorker() {
378 4419 azabala
                        public Object construct() {
379
                                try {
380
                                        task.run();
381
                                        return task;
382
                                } catch (Exception e) {
383
                                        NotificationManager.addError(null, e);
384
                                }
385
                                return null;
386
                        }
387
                };
388
389
                Component mainFrame = (Component) PluginServices.getMainFrame();
390
391
                IProgressMonitorIF progressMonitor = null;
392 4816 azabala
                String title = getText(null, "PluginServices.Procesando");
393
                progressMonitor = new UndefinedProgressMonitor((Frame) mainFrame, title);
394 4419 azabala
                progressMonitor.setIndeterminated(!task.isDefined());
395
                progressMonitor.setInitialStep(task.getInitialStep());
396
                progressMonitor.setLastStep(task.getFinishStep());
397
                progressMonitor.setCurrentStep(task.getCurrentStep());
398
                progressMonitor.setMainTitleLabel(task.getStatusMessage());
399
                progressMonitor.setNote(task.getNote());
400
                progressMonitor.open();
401
                int delay = 500;
402
                TaskMonitorTimerListener timerListener = new TaskMonitorTimerListener(
403
                                progressMonitor, task);
404
                Timer timer = new Timer(delay, timerListener);
405
                timerListener.setTimer(timer);
406
                timer.start();
407
408
                worker.start();
409
410 4338 azabala
        }
411 1141 fernando
412 4419 azabala
        public static void closeApplication() {
413
                Launcher.closeApplication();
414 2142 fernando
        }
415 4419 azabala
416 1141 fernando
        /**
417
         * DOCUMENT ME!
418 5800 caballero
         *
419 1141 fernando
         * @author Fernando Gonz?lez Cort?s
420
         */
421
        private static class RunnableDecorator implements Runnable {
422
                private Runnable r;
423
424
                /**
425
                 * Crea un nuevo RunnableDecorator.
426 5800 caballero
                 *
427 4419 azabala
                 * @param r
428
                 *            DOCUMENT ME!
429 1141 fernando
                 */
430
                public RunnableDecorator(Runnable r) {
431
                        this.r = r;
432
                }
433
434
                /**
435
                 * @see java.lang.Runnable#run()
436
                 */
437
                public void run() {
438 4419 azabala
                        /*
439
                         * try { SwingUtilities.invokeAndWait(new Runnable() { public void
440
                         * run() { getMDIManager().setWaitCursor(); } }); } catch
441
                         * (InterruptedException e) {
442
                         * NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_poner_el_reloj_de_arena"),
443
                         * e); } catch (InvocationTargetException e) {
444
                         * NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_poner_el_reloj_de_arena"),
445
                         * e); }
446
                         */
447
448
                        try {
449 1141 fernando
                                SwingUtilities.invokeAndWait(new Runnable() {
450 4419 azabala
                                        public void run() {
451
                                                try {
452
                                                        r.run();
453
                                                } catch (RuntimeException e) {
454
                                                        NotificationManager
455
                                                                        .addError(
456
                                                                                        Messages
457
                                                                                                        .getString("PluginServices.Bug_en_el_codigo"),
458
                                                                                        e);
459
                                                } catch (Error e) {
460
                                                        NotificationManager
461
                                                                        .addError(
462
                                                                                        Messages
463
                                                                                                        .getString("PluginServices.Error_grave_de_la_aplicaci?n"),
464
                                                                                        e);
465 1141 fernando
                                                }
466 4419 azabala
                                        }
467
                                });
468 1141 fernando
                        } catch (InterruptedException e) {
469 4419 azabala
                                NotificationManager
470
                                                .addWarning(
471
                                                                Messages
472
                                                                                .getString("PluginServices.No_se_pudo_poner_el_reloj_de_arena"),
473
                                                                e);
474 1141 fernando
                        } catch (InvocationTargetException e) {
475 4419 azabala
                                NotificationManager
476
                                                .addWarning(
477
                                                                Messages
478
                                                                                .getString("PluginServices.No_se_pudo_poner_el_reloj_de_arena"),
479
                                                                e);
480 1153 fernando
                        }
481 1141 fernando
482 4419 azabala
                        /*
483
                         * try { SwingUtilities.invokeAndWait(new Runnable() { public void
484
                         * run() { getMDIManager().restoreCursor(); } }); } catch
485
                         * (InterruptedException e) {
486
                         * NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_restaurar_el_cursor_del_raton"),
487
                         * e); } catch (InvocationTargetException e) {
488
                         * NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_restaurar_el_cursor_del_raton"),
489
                         * e); }
490
                         */
491 1141 fernando
                }
492
        }
493 3654 fjp
494
        /**
495
         * Usually appName plugins-directory [locale] [other args]
496 5800 caballero
         *
497 4419 azabala
         * @return the original arguments that Andami received. (app-name
498
         *         plugins-directory, locale, etc)
499 3654 fjp
         */
500
        public static String[] getArguments() {
501
                return arguments;
502
        }
503
504
        public static void setArguments(String[] arguments) {
505
                PluginServices.arguments = arguments;
506
        }
507 3668 fjp
508
        public static Logger getLogger() {
509
                return logger;
510
        }
511 4419 azabala
512
        public static IAuthentication getAuthentication() {
513 4358 ldiaz
                return authentication;
514
        }
515 4419 azabala
516
        public static void setAuthentication(IAuthentication authen) {
517 4358 ldiaz
                authentication = authen;
518
        }
519 5800 caballero
        public static DlgPreferences getDlgPreferences() {
520
                return DlgPreferences.getInstance();
521
        }
522 8765 jjdelcerro
523
        public static void putInClipboard(String data) {
524
                StringSelection ss = new StringSelection(data);
525
526
                Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,ss);
527
        }
528
529
        public static String getFromClipboard() {
530
531
                 try {
532
                        return (String)Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).getTransferData(DataFlavor.stringFlavor);
533
                } catch (UnsupportedFlavorException e) {
534
                        return null;
535
                } catch (IOException e) {
536
                        // TODO Auto-generated catch block
537
                        return null;
538
                }
539
        }
540
541 598 fernando
}