Statistics
| Revision:

root / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / ProjectExtension.java @ 11548

History | View | Annotate | Download (24.3 KB)

1
/* 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
package com.iver.cit.gvsig;
42

    
43
import java.awt.Component;
44
import java.io.BufferedReader;
45
import java.io.File;
46
import java.io.FileInputStream;
47
import java.io.FileNotFoundException;
48
import java.io.FileOutputStream;
49
import java.io.FileReader;
50
import java.io.IOException;
51
import java.io.InputStream;
52
import java.io.InputStreamReader;
53
import java.io.OutputStreamWriter;
54
import java.io.Reader;
55
import java.io.UnsupportedEncodingException;
56
import java.net.MalformedURLException;
57
import java.net.URL;
58
import java.text.DateFormat;
59
import java.util.Date;
60
import java.util.prefs.Preferences;
61

    
62
import javax.swing.JFileChooser;
63
import javax.swing.JOptionPane;
64

    
65
import org.exolab.castor.xml.MarshalException;
66
import org.exolab.castor.xml.Marshaller;
67
import org.exolab.castor.xml.ValidationException;
68

    
69
import com.iver.andami.Launcher;
70
import com.iver.andami.PluginServices;
71
import com.iver.andami.messages.Messages;
72
import com.iver.andami.messages.NotificationManager;
73
import com.iver.andami.plugins.Extension;
74
import com.iver.andami.ui.mdiManager.IWindow;
75
import com.iver.andami.ui.mdiManager.WindowInfo;
76
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
77
import com.iver.cit.gvsig.project.Project;
78
import com.iver.cit.gvsig.project.ProjectFactory;
79
import com.iver.cit.gvsig.project.documents.ProjectDocument;
80
import com.iver.cit.gvsig.project.documents.exceptions.OpenException;
81
import com.iver.cit.gvsig.project.documents.gui.ProjectWindow;
82
import com.iver.cit.gvsig.project.documents.layout.ProjectMap;
83
import com.iver.cit.gvsig.project.documents.layout.ProjectMapFactory;
84
import com.iver.cit.gvsig.project.documents.layout.gui.Layout;
85
import com.iver.cit.gvsig.project.documents.table.ProjectTableFactory;
86
import com.iver.cit.gvsig.project.documents.view.ProjectViewFactory;
87
import com.iver.utiles.GenericFileFilter;
88
import com.iver.utiles.XMLEntity;
89
import com.iver.utiles.extensionPoints.ExtensionPoint;
90
import com.iver.utiles.extensionPoints.ExtensionPoints;
91
import com.iver.utiles.extensionPoints.ExtensionPointsSingleton;
92
import com.iver.utiles.xml.XMLEncodingUtils;
93
import com.iver.utiles.xmlEntity.generate.XmlTag;
94

    
95

    
96
/**
97
 * Extension que proporciona controles para crear proyectos nuevos, abrirlos y
98
 * guardarlos. Adem?s los tipos de tabla que soporta el proyecto son a?adidos
99
 * en esta clase.
100
 *
101
 * @author Fernando Gonz?lez Cort?s
102
 */
103
public class ProjectExtension extends Extension {
104
        private static String projectPath = null;
105
        //private ProjectWindow projectFrame;
106
        private ProjectWindow projectFrame;
107
        private Project p;
108
        private String lastPath;
109
        private String lastSavePath;
110
        private String templatesPath;
111
        private WindowInfo seedProjectWindow;
112
        /**
113
         * Use UTF-8 for encoding, as it can represent characters from
114
         * any language.
115
         *
116
         * Another sensible option would be
117
         * encoding = System.getProperty("file.encoding");
118
         * but this would need some extra testing.
119
         */
120
        public static String PROJECTENCODING = "UTF-8";
121

    
122
        /**
123
         * @see com.iver.mdiApp.plugins.IExtension#initialize()
124
         */
125
        public void initialize() {
126
            try {
127
            Class.forName("javax.media.jai.EnumeratedParameter");
128
        } catch (ClassNotFoundException e) {
129
            NotificationManager.addError("La m?quina virtual con la que se ejecuta gvSIG no tiene JAI instalado", e);
130
        }
131

    
132
                LayerFactory.setWritersPath(PluginServices.getPluginServices(this)
133
                                  .getPluginDirectory()
134
                                  .getAbsolutePath() +
135
                                  File.separator + "drivers");
136

    
137
        LayerFactory.setDriversPath(PluginServices.getPluginServices(this)
138
                                  .getPluginDirectory()
139
                                  .getAbsolutePath() +
140
                                  File.separator + "drivers");
141

    
142
        initializeDocumentActionsExtensionPoint();
143
        registerDocuments();
144

    
145
        // Recuperamos el ?ltimo argumento, que se supone
146
        // que ser? el fichero .gvp que queremos abrir.
147
        // (por enmedio pueden venir o no otros argumentos,
148
        // por ejemplo el idioma)
149
        // TODO: Aqu? Jaume podr?a meter lo del backup del proyecto
150
        // que ha hecho para ValenciaUrban?stica
151

    
152
                /*
153
                pe = (ProjectExtension) PluginServices.getExtension(com.iver.cit.gvsig.ProjectExtension.class);
154
                if (projectFile.length()!=0){
155
                        p=pe.readProject(projectFile);
156
                }
157
                else
158
                        p = restorePreviousProject();
159
                pe.setProject(p); */
160
        String[] theArgs = PluginServices.getArguments();
161
        String lastArg = theArgs[theArgs.length-1];
162
        if ((lastArg.endsWith(".gvp")) ||
163
                        (lastArg.endsWith(".GVP")))
164
        {
165
                PluginServices.getLogger().debug("Intentando cargar el proyecto " + lastArg);
166
                //File projectFile = new File(lastArg);
167
                setProject(readProject(lastArg));
168
                PluginServices.getMainFrame().setTitle(p.getName());
169
                projectPath = lastArg;
170
        }
171
        else
172
        {
173
                        setProject(ProjectFactory.createProject());
174
                        p.setName(PluginServices.getText(this, "untitled"));
175
                        p.setModified(false);
176
                        PluginServices.getMainFrame().setTitle(PluginServices.getText(this, "sin_titulo"));
177
        }
178
        }
179
        /**
180
         * @see com.iver.mdiApp.plugins.IExtension#postInitialize()
181
         */
182
        public void postInitialize() {
183
                getProjectFrame().setProject(p);
184
                p.restoreWindowProperties();
185
        }
186

    
187
        public ProjectWindow getProjectFrame() {
188
                if (projectFrame==null)
189
                                projectFrame = new ProjectWindow();
190
                return projectFrame;
191
        }
192
        /**
193
         * Muestra la ventana con el gestor de proyectos.
194
         */
195
        public void showProjectWindow() {
196
                if (seedProjectWindow!=null) {
197
                        if (seedProjectWindow.isClosed()) {
198
                                // if it was closed, we just don't open the window now
199
                                seedProjectWindow.setClosed(false);
200
                                return;
201
                        }
202
                        WindowInfo winProps = seedProjectWindow;
203
                        seedProjectWindow = null;
204
                        PluginServices.getMDIManager().addWindow(getProjectFrame());
205
                        PluginServices.getMDIManager().changeWindowInfo(getProjectFrame(), winProps);
206
                }
207
                else
208
                        PluginServices.getMDIManager().addWindow(getProjectFrame());
209
        }
210

    
211
        /**
212
         * Muestra la ventana con el gestor de proyectos, con las propiedades
213
         * de ventana especificadas.
214
         */
215
        public void showProjectWindow(WindowInfo wi) {
216
                seedProjectWindow = wi;
217
                showProjectWindow();
218
        }
219

    
220
        /**
221
         * Guarda el proyecto actual en disco.
222
         */
223
        private boolean guardar() {
224
                boolean saved=false;
225
//                if (p.getPath() == null) {
226
                if (projectPath == null) {
227
                        saved=guardarDialogo();
228
                } else {
229
                        saved=writeProject(new File(projectPath), p); //new File(p.getPath()), p);
230
                        getProjectFrame().refreshControls();
231
                }
232
                return saved;
233
        }
234

    
235
        private boolean guardarDialogo(){
236
                boolean saved=false;
237

    
238
                if (lastSavePath == null)
239
                        lastSavePath = projectPath;
240

    
241
                if (lastSavePath == null) {
242
                        Preferences prefs = Preferences.userRoot().node( "gvsig.foldering" );
243
                        lastSavePath = prefs.get("ProjectsFolder", null);
244
                }
245

    
246
                JFileChooser jfc = new JFileChooser(lastSavePath);
247
                jfc.addChoosableFileFilter(new GenericFileFilter("gvp",
248
                                PluginServices.getText(this, "tipo_fichero_proyecto")));
249

    
250
                if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
251
                        File file=jfc.getSelectedFile();
252
                        if (!(file.getPath().toLowerCase().endsWith(".gvp"))){
253
                                file=new File(file.getPath()+".gvp");
254
                        }
255
                        saved=writeProject(file, p);
256
                        String filePath = file.getAbsolutePath();
257
                        lastSavePath = filePath.substring(0, filePath.lastIndexOf(File.separatorChar));
258

    
259
                        getProjectFrame().refreshControls();
260
                }
261
                return saved;
262
        }
263
        /**
264
         * Guarda si el proyecto ha sido modificado.
265
         *
266
         * @return True si se ha guardado correctamente.
267
         */
268
        private int askSave() {
269
                if (p.hasChanged()) {
270
                ///if (true) {
271
                        //TODO de momento se queda como modificado siempre menos cuando est? totalmente vacio que se tomar? como no modificado,
272
                        //para poder controlar perfectamente cuando un proyecto ha sido modificado
273
                        //hay que recoger los eventos de cambio de leyenda, cambio de extent, a?adir una capa, etc que se encuentran en FMap.
274

    
275
                        return JOptionPane.showConfirmDialog((Component) PluginServices.getMainFrame(),
276
                                        PluginServices.getText(this, "guardar_cambios"),
277
                                        "gvSIG",
278
                                        JOptionPane.YES_NO_CANCEL_OPTION,
279
                                        JOptionPane.INFORMATION_MESSAGE);
280

    
281
                }
282

    
283
                return JOptionPane.NO_OPTION;
284
        }
285

    
286
        /**
287
         * @see com.iver.mdiApp.plugins.IExtension#updateUI(java.lang.String)
288
         */
289
        public void execute(String actionCommand) {
290
                if (actionCommand.equals("NUEVO")) {
291
                        projectPath=null;
292
                        //Si est? modificado se pregunta si se quiere guardar el anterior
293
                        int answer = askSave();
294
                        if (answer == JOptionPane.CANCEL_OPTION) {
295
                                // then do nothing
296
                                return;
297
                        } else if (answer == JOptionPane.YES_OPTION) {
298
                                execute("GUARDAR");
299
                        }
300
                        ProjectDocument.initializeNUMS();
301
                        PluginServices.getMDIManager().closeAllWindows();
302
                        setProject(ProjectFactory.createProject());
303

    
304
//                        p.setModified(true);
305
                        getProjectFrame().setProject(p);
306
                        showProjectWindow();
307
                        PluginServices.getMainFrame().setTitle(PluginServices.getText(this, "sin_titulo"));
308
                } else if (actionCommand.equals("ABRIR")) {
309
                        //Si est? modificado se pregunta si se quiere guardar el anterior
310
                        int answer = askSave();
311

    
312
                        if (answer == JOptionPane.CANCEL_OPTION) { // ? don't ask me why
313
                                ProjectDocument.initializeNUMS();
314
                                return;
315
                        }
316

    
317
                        if (lastPath == null) {
318
                                Preferences prefs = Preferences.userRoot().node( "gvsig.foldering" );
319
                                lastPath = prefs.get("ProjectsFolder", null);
320
                        }
321

    
322
                        JFileChooser jfc = new JFileChooser(lastPath);
323
                        jfc.addChoosableFileFilter(new GenericFileFilter("gvp",
324
                                        PluginServices.getText(this, "tipo_fichero_proyecto")));
325

    
326
                        if (jfc.showOpenDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
327
                                ProjectDocument.initializeNUMS();
328
                                PluginServices.getMDIManager().closeAllWindows();
329

    
330
                                File projectFile = jfc.getSelectedFile();
331
                                Project o = readProject(projectFile);
332
                                setPath(projectFile.getAbsolutePath());
333
                                lastPath = getPath();
334
                                if (o != null) {
335
                                        setProject(o);
336
                                }
337

    
338
                                getProjectFrame().setProject(p);
339
                                PluginServices.getMainFrame().setTitle(p.getName());
340
                                getProjectFrame().refreshControls();
341

    
342
//jaume                                p.setModified(true);
343
                                p.restoreWindowProperties();
344
                        }
345
                } else if (actionCommand.equals("GUARDAR")) {
346
                        guardar();
347
//jaume                        p.setModified(false);
348
                } else if (actionCommand.equals("GUARDAR_COMO")) {
349
                        guardarDialogo();
350
//jaume                        p.setModified(false);
351
                } else if (actionCommand.equals("SALIR")){
352
                        int option = JOptionPane.showConfirmDialog((Component)PluginServices.getMainFrame(),
353
                                        Messages.getString("MDIFrame.quiere_salir"),
354
                                        Messages.getString("MDIFrame.salir"),
355
                                        JOptionPane.YES_NO_OPTION);
356

    
357
                        if (option == JOptionPane.YES_OPTION) {
358
                                Launcher.closeApplication();
359
                        }
360
                } else if (actionCommand.compareTo("OPENTEMPLATE")==0){
361
                        openLayout();
362
//jaume                        p.setModified(true);
363
                }
364
        }
365
        public void openLayout() {
366
                //Project project = ((ProjectExtension) PluginServices.getExtension(ProjectExtension.class)).getProject();
367
                Layout layout=null;
368

    
369
                if (templatesPath == null) {
370
                        Preferences prefs = Preferences.userRoot().node( "gvsig.foldering" );
371
                        templatesPath = prefs.get("TemplatesFolder", null);
372
                }
373

    
374
                JFileChooser jfc = new JFileChooser(templatesPath);
375
                jfc.addChoosableFileFilter(new GenericFileFilter("gvt",
376
                                PluginServices.getText(this, "plantilla")));
377

    
378
                if (jfc.showOpenDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
379
                        File file=jfc.getSelectedFile();
380
                        if (!(file.getPath().endsWith(".gvt") || file.getPath().endsWith(".GVT"))){
381
                                file=new File(file.getPath()+".gvt");
382
                        }
383
                        try {
384
                                File xmlFile = new File(file.getAbsolutePath());
385
                                FileReader reader;
386
                                reader = new FileReader(xmlFile);
387

    
388
                                XmlTag tag = (XmlTag) XmlTag.unmarshal(reader);
389
                                try {
390
                                        layout = Layout.createLayout(new XMLEntity(tag),p);
391
                                } catch (OpenException e) {
392
                                        e.showError();
393
                                }
394
                                //fPanelLegendManager.setRenderer(LegendFactory.createFromXML(new XMLEntity(tag)));
395
                        } catch (FileNotFoundException e) {
396
                                NotificationManager.addError(PluginServices.getText(this, "Al_leer_la_leyenda"), e);
397
                        } catch (MarshalException e) {
398
                                NotificationManager.addError(PluginServices.getText(this, "Al_leer_la_leyenda"), e);
399
                        } catch (ValidationException e) {
400
                                NotificationManager.addError(PluginServices.getText(this, "Al_leer_la_leyenda"), e);
401
                        }
402
                        ProjectMap pmap = ProjectFactory.createMap(file.getName());
403
                        pmap.setModel(layout);
404
                        pmap.getModel().setProjectMap(pmap);
405
                        p.addDocument(pmap);
406
                        PluginServices.getMDIManager().addWindow(layout);
407

    
408

    
409
                }
410
        }
411
        /**
412
         * Escribe el proyecto en XML.
413
         *
414
         * @param file Fichero.
415
         * @param p Proyecto.
416
         */
417
        public boolean writeProject(File file, Project p) {
418
                return writeProject(file, p, true);
419
        }
420

    
421
        /**
422
         * Escribe el proyecto en XML. Pero permite decidir si se
423
         * pide confirmaci?n para sobreescribir
424
         *
425
         * @param file Fichero.
426
         * @param p Proyecto.
427
         * @param askConfirmation boolean
428
         */
429
        public boolean writeProject(File file, Project p, boolean askConfirmation) {
430
                if( askConfirmation && file.exists()){
431
                        int resp = JOptionPane.showConfirmDialog(
432
                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
433
                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
434
                        if (resp != JOptionPane.YES_OPTION) {
435
                                return false;
436
                        }
437
                }
438
                // write it out as XML
439
                try {
440
            FileOutputStream fos = new FileOutputStream(file.getAbsolutePath());
441
            OutputStreamWriter writer = new OutputStreamWriter(fos, PROJECTENCODING);
442
                        Marshaller m = new Marshaller(writer);
443
                        m.setEncoding(PROJECTENCODING);
444
                        p.setName(file.getName());
445
                        // p.setPath(file.toString());
446
                        p.setModificationDate(DateFormat.getDateInstance().format(new Date()));
447
                        p.setModified(false);
448
                        XMLEntity xml = p.getXMLEntity();
449
                        xml.putProperty("followHeaderEncoding", true, false);
450
                        m.marshal(xml.getXmlTag());
451
                        PluginServices.getMainFrame().setTitle(file.getName());
452
                        setPath(file.toString());
453

    
454
                } catch (Exception e) {
455
                        NotificationManager.addError("Error guardando el proyecto", e);
456
                        return false;
457
                }
458
                return true;
459
        }
460

    
461
        public Project readProject(String path) {
462
                BufferedReader reader =null;
463
                try {
464
                URL url=null;
465
                        url = new URL(path);
466
                        String encoding = XMLEncodingUtils.getEncoding(url.openStream());
467
                        InputStream is = url.openStream();
468
                        if (encoding!=null) {
469
                                Project proj=null;
470
                                try {
471
                                        reader = new BufferedReader(new InputStreamReader(is, encoding));
472
                                        proj=readProject(reader, true);
473
                                } catch (UnsupportedEncodingException e) {
474
                                        reader = new BufferedReader(new InputStreamReader(is));
475
                                        try {
476
                                                Project p=readProject(reader, false);
477
                                        } catch (UnsupportedEncodingException e1) {
478
                                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),PluginServices.getText(this, e1.getLocalizedMessage()));
479
                                                return null;
480
                                        }
481
                                }
482
                                ProjectExtension.setPath(path);
483
                                return proj;
484
                        }
485
                        else {
486
                                reader = new BufferedReader(new InputStreamReader(is));
487
                                Project p;
488
                                try {
489
                                        p = readProject(reader, false);
490
                                } catch (UnsupportedEncodingException e) {
491
                                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),PluginServices.getText(this, e.getLocalizedMessage()));
492
                                        return null;
493
                                }
494
                                ProjectExtension.setPath(path); //p.setPath(null);
495
                                return p;
496
                        }
497
                } catch (MalformedURLException e) {
498
                        File file=new File(path);
499
                        return readProject(file);
500
                } catch (IOException e) {
501
                        e.printStackTrace();
502
                        return null;
503
                }
504
        }
505

    
506
        /**
507
         * Lee del XML el proyecto.<br><br>
508
         *
509
         * Reads the XML of the project.<br>
510
         * It returns a project object holding all needed info that is not linked to the Project Dialog. <br>In case you want the project to be
511
         * linked to the window you must set this object to the extension:<br>
512
         *
513
         * <b>Example:</b><br>
514
         *
515
         * ...<br>
516
         * ...<br>
517
         * Project p = ProjectExtension.readProject(projectFile);<br>
518
         * ProjectExtension.setProject(p);
519
         * ...<br>
520
         * ...<br>
521
         * @param file Fichero.
522
         *
523
         * @return Project
524
         *
525
         */
526
        public Project readProject(File file) {
527
                File xmlFile = new File(file.getAbsolutePath());
528
                try {
529
                        String encoding = XMLEncodingUtils.getEncoding(new FileInputStream(xmlFile));
530
                        InputStreamReader reader=null;
531
                        if (encoding!=null) {
532
                                try {
533
                                        reader = new InputStreamReader(new FileInputStream(xmlFile), encoding);
534
                                        return readProject(reader, true);
535
                                } catch (UnsupportedEncodingException e) {
536
                                        reader = new InputStreamReader(new FileInputStream(xmlFile));
537
                                        try {
538
                                                return readProject(reader, false);
539
                                        } catch (UnsupportedEncodingException e1) {
540
                                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),PluginServices.getText(this, e1.getLocalizedMessage()));
541
                                                return null;
542
                                        }
543
                                }
544
                        }
545
                        else {
546
                                reader = new InputStreamReader(new FileInputStream(xmlFile));
547
                                try {
548
                                        return readProject(reader, false);
549
                                } catch (UnsupportedEncodingException e1) {
550
                                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),PluginServices.getText(this, e1.getLocalizedMessage()));
551
                                        return null;
552
                                }
553
                        }
554
                } catch (FileNotFoundException e) {
555
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),PluginServices.getText(this, "fichero_incorrecto"));
556
                        return null;
557
                }
558
        }
559

    
560
        /**
561
         * Lee del XML el proyecto.<br><br>
562
         *
563
         * Reads the XML of the project.<br>
564
         * It returns a project object holding all needed info that is not linked to the Project Dialog. <br>In case you want the project to be
565
         * linked to the window you must set this object to the extension:<br>
566
         *
567
         * <b>Example:</b><br>
568
         *
569
         * ...<br>
570
         * ...<br>
571
         * Project p = ProjectExtension.readProject(projectFile);<br>
572
         * ProjectExtension.setProject(p);
573
         * ...<br>
574
         * ...<br>
575
         * @param reader File reader
576
         * @param encodingFollowed Whether the encoded specified in the xml header was followed
577
         * when creating the reader. If the property followHeaderEncoding is false or not set,
578
         * then the encoding should have not been used when creating the reader, so it must be
579
         * recreated.
580
         *
581
         * @return Project
582
         * @throws UnsupportedEncodingException
583
         *
584
         */
585
        public Project readProject(Reader reader, boolean encodingFollowed) throws UnsupportedEncodingException {
586
                Project proj = null;
587

    
588
                try {
589
                        XmlTag tag = (XmlTag) XmlTag.unmarshal(reader);
590
                        XMLEntity xml=new XMLEntity(tag);
591
                        String VERSION=xml.getStringProperty("VERSION");
592

    
593
                        if (encodingFollowed) {
594
                                if (xml.contains("followHeaderEncoding")) {
595
                                        boolean useEncoding = xml.getBooleanProperty("followHeaderEncoding");
596
                                        if (!useEncoding) {
597
                                                throw new UnsupportedEncodingException("the encoding specified in the xml header is not safe");
598
                                        }
599
                                }
600
                                else {
601
                                        // Old projects didn't contain followHeaderEncoding and they were
602
                                        // not correctly encoded. We throw an exception now, and we'll try
603
                                        // to reopen the project
604
                                        // using the default system encoding.
605
                                        throw new UnsupportedEncodingException("the encoding specified in the xml header is not safe");
606
                                }
607
                        }
608

    
609
                        try {
610
                                // if ((VERSION!=null) && (VERSION.equals("0.5") || VERSION.equals("0.4") || (VERSION.indexOf("GISPLANET") != -1))){
611
                                if (VERSION != null) {
612
                                        proj = Project.createFromXML(xml);
613
                                }else{
614
                                        proj = Project.createFromXML03(new XMLEntity(tag));
615
                                }
616
                                return proj;
617
                        } catch (OpenException e){
618
                                e.showError();
619
                                //NotificationManager.addInfo("Al leer el proyecto", e);
620
                        }
621
                }  catch (MarshalException e) {
622
                        PluginServices.getLogger().error(PluginServices.getText(this, "formato_incorrecto"),e);
623
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),PluginServices.getText(this, "formato_incorrecto"));
624
                        //NotificationManager.addError("Al leer el proyecto", e);
625
                } catch (ValidationException e) {
626
                        PluginServices.getLogger().error(PluginServices.getText(this, "formato_incorrecto"),e);
627
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),PluginServices.getText(this, "formato_incorrecto"));
628
                        //NotificationManager.addError("Al leer el proyecto", e);
629
                }
630
                return null;
631
        }
632

    
633
        /**
634
         * Devuelve el proyecto.
635
         *
636
         * @return Proyecto.
637
         */
638
        public Project getProject() {
639
                return p;
640
        }
641

    
642
        /**
643
         * @see com.iver.andami.plugins.IExtension#isEnabled()
644
         */
645
        public boolean isEnabled() {
646
                return true;
647
        }
648

    
649
        /**
650
         * @see com.iver.andami.plugins.IExtension#isVisible()
651
         */
652
        public boolean isVisible() {
653
                return true;
654
        }
655

    
656
        /**
657
         * Sets the project
658
         * @param p
659
         */
660
        public void setProject(Project p){
661
                getProjectFrame().setProject(p);
662
                this.p=p;
663
        }
664

    
665
        public boolean isReadyToTerminate() {
666
                int answer = askSave();
667

    
668
                if (answer == JOptionPane.CANCEL_OPTION) {
669
                        // the user doesn't want to close the application
670
                        // so quit will be canceled.
671
                        return false;
672
                } else if (answer == JOptionPane.YES_OPTION) {
673
                        // the user wants to save the project before exit
674
                        boolean ready = guardar();
675
                        if (!ready) {
676
                                int sel = JOptionPane.showConfirmDialog((Component) PluginServices.getMainFrame(),
677
                                                PluginServices.getText(this, "the_project_could_not_be_saved.Continue_exiting_anyway"),
678
                                                PluginServices.getText(this, "warning"),
679
                                                JOptionPane.YES_NO_OPTION);
680
                                ready = (sel == JOptionPane.YES_OPTION);
681
                        }
682

    
683
                        return ready;
684
                } else if (answer == JOptionPane.NO_OPTION) {
685
                        // the user doesn't care about the current state of the project
686
                        return true;
687
                } else {
688
                        NotificationManager.addWarning("Reached what should be unreachable code", new IllegalArgumentException());
689
                        return false;
690
                }
691
        }
692

    
693
        //Finalizar y preguntar si se quiere guardar el proyecto o cancelar.
694
        public void terminate() {
695
//                long t1,t2;
696
//                t1 = System.currentTimeMillis();
697
//                if (askSave()){
698
//                        int option = JOptionPane.showConfirmDialog((Component)PluginServices.getMainFrame(),PluginServices.getText(this,"guardar_cambios"),
699
//                                        PluginServices.getText(this,"guardar_proyecto"),
700
//                                        JOptionPane.YES_NO_OPTION);
701
//
702
//                        if (option == JOptionPane.YES_OPTION) {
703
//                                if (!guardar())
704
//                                        terminate();
705
//                        }
706
//                }
707
//                t2 = System.currentTimeMillis();
708
//                System.err.println("ProjectExtension.terminate() " +  (t2-t1) + "milisecs");
709
        }
710

    
711
        private void registerDocuments() {
712
                ProjectViewFactory.register();
713
                ProjectTableFactory.register();
714
                ProjectMapFactory.register();
715
        }
716

    
717
        private void initializeDocumentActionsExtensionPoint() {
718
                ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
719
                if (!extensionPoints.containsKey("DocumentActions_View")) {
720
                        extensionPoints.put(
721
                                new ExtensionPoint(
722
                                        "DocumentActions_View",
723
                                        "Context menu options of the view document list" +
724
                                                " in the project window "+
725
                                                "(register instances of " +
726
                                                "com.iver.cit.gvsig.project.AbstractDocumentContextMenuAction)"
727
                                )
728
                        );
729
                }
730
                if (!extensionPoints.containsKey("DocumentActions_Table")) {
731
                        extensionPoints.put(
732
                                new ExtensionPoint(
733
                                        "DocumentActions_Table",
734
                                        "Context menu options of the table document list" +
735
                                                " in the project window "+
736
                                                "(register instances of " +
737
                                                "com.iver.cit.gvsig.project.AbstractDocumentContextMenuAction)"
738
                                )
739
                        );
740
                }
741
                if (!extensionPoints.containsKey("DocumentActions_Map")) {
742
                        extensionPoints.put(
743
                                new ExtensionPoint(
744
                                        "DocumentActions_Map",
745
                                        "Context menu options of the map document list" +
746
                                                " in the project window "+
747
                                                "(register instances of " +
748
                                                "com.iver.cit.gvsig.project.AbstractDocumentContextMenuAction)"
749
                                )
750
                        );
751
                }
752
        }
753

    
754
        public static String getPath() {
755
                return projectPath;
756
        }
757

    
758
        public static void setPath(String path) {
759
                projectPath = path;
760
        }
761

    
762
        public IWindow getProjectWindow() {
763
                return getProjectFrame();
764
        }
765
}