Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / project / documents / view / DefaultViewDocument.java @ 44259

History | View | Annotate | Download (8.05 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24

    
25
package org.gvsig.app.project.documents.view;
26

    
27
import javax.swing.JOptionPane;
28
import org.gvsig.andami.PluginsLocator;
29
import org.gvsig.andami.PluginsManager;
30
import org.gvsig.app.ApplicationLocator;
31
import org.gvsig.app.ApplicationManager;
32
import org.gvsig.app.extension.AddLayer;
33
import org.gvsig.app.gui.preferencespage.LayerOrderPage;
34
import org.gvsig.app.project.ProjectPreferences;
35
import org.gvsig.app.project.documents.DocumentManager;
36
import org.gvsig.fmap.dal.exception.ReadException;
37
import org.gvsig.fmap.geom.primitive.Envelope;
38
import org.gvsig.fmap.mapcontext.MapContext;
39
import org.gvsig.fmap.mapcontext.MapContextLocator;
40
import org.gvsig.fmap.mapcontext.ViewPort;
41
import org.gvsig.fmap.mapcontext.layers.BaseLayerCollectionListener;
42
import org.gvsig.fmap.mapcontext.layers.FLayer;
43
import org.gvsig.fmap.mapcontext.layers.LayerCollectionEvent;
44
import org.gvsig.fmap.mapcontext.layers.order.LayerOrderManager;
45
import org.gvsig.tools.ToolsLocator;
46
import org.gvsig.tools.dynobject.DynObject;
47
import org.gvsig.tools.i18n.I18nManager;
48
import org.gvsig.tools.persistence.PersistentState;
49
import org.gvsig.tools.persistence.exception.PersistenceException;
50
import org.slf4j.Logger;
51
import org.slf4j.LoggerFactory;
52

    
53

    
54

    
55
/**
56
 * Clase que representa una vista del proyecto
57
 * 
58
 */
59

    
60
public class DefaultViewDocument extends BaseViewDocument {
61

    
62
        private static Logger logger = LoggerFactory.getLogger(DefaultViewDocument.class);
63
        /**
64
         * 
65
         */
66
        private static final long serialVersionUID = 676711512482334764L;
67

    
68
        public static final String PERSISTENCE_DEFINITION_NAME = "DefaultViewDocument";
69
        
70
    private class SetViewPortExtentWhenAddLayerListener extends BaseLayerCollectionListener {
71

    
72
        private Thread th = null;
73
        private final ViewPort viewPort;
74
        
75
        public SetViewPortExtentWhenAddLayerListener(ViewPort viewPort) {
76
            this.viewPort = viewPort;
77
        }
78
        
79
        @Override
80
        public synchronized void layerAdded(LayerCollectionEvent e) {
81
            if( th != null ) {
82
                return;
83
            }
84
            if (viewPort.getEnvelope() == null) {
85
                final FLayer layer = e.getAffectedLayer();
86
                if (layer.isAvailable() )  {
87
                    th = new Thread(new Runnable() {
88
                        @Override
89
                        public void run() {
90
                            try {
91
                                ApplicationManager application = ApplicationLocator.getManager();
92
                                I18nManager i18n = ToolsLocator.getI18nManager();
93
                                application.message(
94
                                    i18n.getTranslation("_Calculating_envelope"),
95
                                    JOptionPane.INFORMATION_MESSAGE
96
                                );
97
                                Envelope envelope = layer.getFullEnvelope();
98
                                // Si nadie le ha asignado un envelope mientras se
99
                                // calculaba el inicial le asignamos el calculado.
100
                                if (viewPort.getEnvelope() == null) {
101
                                    viewPort.setEnvelope(envelope);
102
                                }
103
                                application.message(
104
                                    "",
105
                                    JOptionPane.INFORMATION_MESSAGE
106
                                );
107
                            } catch (ReadException ex) {
108
                            }
109
                        }
110
                    }, "AddLayerToView");
111
                    th.start();
112
                    // Forzamos a salir del scheduler para dar paso al nuevo 
113
                    // thread que acabamos de crear. Prefiero el sleep al yield
114
                    // ya que este ultimo puede ser ignorado por el scheduler.
115
                    try {
116
                        Thread.sleep(1);
117
                    } catch (InterruptedException ex) {
118
                    }
119
                }
120
            }
121
        }
122
            
123
    }
124

    
125
        public DefaultViewDocument() {
126
                this(null);
127
        }
128
        
129
        public DefaultViewDocument(DocumentManager factory) {
130
                super(factory); 
131

    
132
                ViewPort vp;
133
        
134
                ProjectPreferences preferences = (ProjectPreferences) ApplicationLocator.getManager().getPreferences("project");
135
            
136
            MapContext viewMapContext = new MapContext(
137
                                new ViewPort( preferences.getDefaultProjection() )
138
                );
139
                vp = viewMapContext.getViewPort();
140
                vp.setBackColor(preferences.getDefaultViewBackColor());
141
                vp.setDistanceUnits(preferences.getDefaultDistanceUnits());
142
                vp.setDistanceArea(preferences.getDefaultDistanceArea());
143
                
144
                /*
145
                 * Another user preference: the order manager
146
                 */
147
                LayerOrderManager lom = getCurrentOrderManager();
148
                viewMapContext.setOrderManager(lom);
149
                
150
                
151
                /*
152
                 * Not very elegant but we are forcing meters if projected
153
                 */
154
                if (viewMapContext.getProjection().isProjected()) {
155
                    vp.setMapUnits(1);
156
                } else {
157
            vp.setMapUnits(8);
158
                }
159
                
160
                
161
                this.setMapContext(viewMapContext);
162
                
163
                MapContext overviewMapContext = new MapContext(
164
                                new ViewPort( viewMapContext.getProjection() )
165
                );
166
                vp = viewMapContext.getViewPort();
167
                vp.setBackColor(preferences.getDefaultViewBackColor());
168
                this.setMapOverViewContext(overviewMapContext);
169
        
170
        this.getMapContext().getLayers().addLayerCollectionListener(
171
            new SetViewPortExtentWhenAddLayerListener(this.getMapContext().getViewPort())
172
        );
173
        this.getMapOverViewContext().getLayers().addLayerCollectionListener(
174
            new SetViewPortExtentWhenAddLayerListener(this.getMapOverViewContext().getViewPort())
175
        );
176
        }
177
        
178
        /**
179
         * Get current order manager from persistence
180
         * 
181
         * @return
182
         */
183
        private LayerOrderManager getCurrentOrderManager() {
184
                
185
                DynObject props = this.getPluginProperties();
186
                // current_layer_order_manager
187
                Object val_obj = null;
188
                if (props.hasDynValue(LayerOrderPage.PREFERENCES_ID)) {
189
                        val_obj = props.getDynValue(LayerOrderPage.PREFERENCES_ID);
190
                }
191
                if (val_obj != null && val_obj instanceof LayerOrderManager) {
192
                        LayerOrderManager lom = (LayerOrderManager) val_obj;
193
                        return lom;
194
                } else {
195
                        logger.info("No order manager found in persistence.");
196
                        return MapContextLocator.getDefaultOrderManager();
197
                }
198
                
199
        }
200
        
201
        private DynObject getPluginProperties() {
202
        PluginsManager pluginsManager = PluginsLocator.getManager();
203
        return pluginsManager.getPlugin(AddLayer.class).getPluginProperties();
204
        }
205
        
206
        
207
        public void saveToState(PersistentState state) throws PersistenceException {
208
                super.saveToState(state);
209
        }
210
        
211
        public void loadFromState(PersistentState state) throws PersistenceException {
212
                super.loadFromState(state);
213
        }
214

    
215
        public String exportDocumentAsText() {
216
                // FIXME: jjdc PersistentManager getStateAsText o similar
217
//                 PersistenceManager manager = ToolsLocator.getPersistenceManager();
218
//                 PersistentState state = manager.getState(this);
219
//                 return manager.getStateAsText(state);
220
                return null;
221
        }
222

    
223
        public void setStateFromText(String text) {
224
                // FIXME: jjdc PersistentManager getStateFromText o similar
225
//                 PersistenceManager manager = ToolsLocator.getPersistenceManager();
226
//                 PersistentState state = manager.getStateFromText(text);
227
//                 this.loadFromState(state);
228
        }
229

    
230
        
231
}