Revision 40927 trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/project/documents/view/legend/gui/LegendManager.java

View differences:

LegendManager.java
38 38
import java.util.ArrayList;
39 39
import java.util.Enumeration;
40 40
import java.util.Hashtable;
41
import java.util.List;
41 42
import java.util.prefs.Preferences;
42 43

  
43 44
import javax.swing.ImageIcon;
......
64 65

  
65 66
import org.gvsig.andami.PluginServices;
66 67
import org.gvsig.andami.messages.NotificationManager;
68
import org.gvsig.app.ApplicationLocator;
69
import org.gvsig.fmap.geom.Geometry;
70
import org.gvsig.fmap.mapcontext.MapContextLocator;
71
import org.gvsig.fmap.mapcontext.MapContextManager;
67 72
import org.gvsig.fmap.mapcontext.exceptions.LegendLayerException;
73
import org.gvsig.fmap.mapcontext.exceptions.WriteLegendException;
68 74
import org.gvsig.fmap.mapcontext.layers.FLayer;
69 75
import org.gvsig.fmap.mapcontext.layers.FLayers;
70 76
import org.gvsig.fmap.mapcontext.layers.operations.Classifiable;
......
73 79
import org.gvsig.fmap.mapcontext.rendering.legend.IClassifiedVectorLegend;
74 80
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
75 81
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
82
import org.gvsig.fmap.mapcontext.rendering.legend.driver.ILegendReader;
83
import org.gvsig.fmap.mapcontext.rendering.legend.driver.ILegendWriter;
76 84
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager;
85
import org.gvsig.i18n.Messages;
77 86
import org.gvsig.tools.ToolsLocator;
78 87
import org.gvsig.tools.persistence.PersistenceManager;
79 88

  
......
127 136
        Preferences prefs = Preferences.userRoot().node("gvsig.foldering");
128 137
        defaultLegendFolderPath = prefs.get("LegendsFolder", "");
129 138
    }
139
    
130 140
    private ActionListener loadSaveLegendAction = new ActionListener() {
131 141

  
132 142
        public void actionPerformed(java.awt.event.ActionEvent e) {
133 143
            JComponent c = (JComponent) e.getSource();
134 144
            if (c.equals(getBtnSaveLegend())) {
135
                saveLegend();
145
                
146
                try {
147
                    saveLegend();
148
                } catch (Exception exc) {
149
                    JOptionPane.showMessageDialog(
150
                        ApplicationLocator.getManager().getRootComponent(),
151
                        Messages.getText("_Unable_to_save_legend")
152
                        + "\n\n" + exc.getMessage(),
153
                        Messages.getText("legend"),
154
                        JOptionPane.WARNING_MESSAGE);
155
                    return;
156
                }
136 157

  
137 158
            } else
138 159
                if (c.equals(getBtnLoadLegend())) {
139
                    loadLegend();
160
                    try {
161
                        loadLegend();
162
                    } catch (Exception e1) {
163
                        JOptionPane.showMessageDialog(
164
                            ApplicationLocator.getManager().getRootComponent(),
165
                            Messages.getText("_Unable_to_read_legend")
166
                            + "\n\n" + e1.getMessage(),
167
                            Messages.getText("legend"),
168
                            JOptionPane.WARNING_MESSAGE);
169
                        return;
170
                    }
140 171
                }
141 172
        }
142 173

  
143
        private void saveLegend() {
174
        private void saveLegend() throws Exception {
175
            
176
            List<LegendFileFilter> filters = getLegendFileFilters(true);
177
            if (filters.size() == 0) {
178
                JOptionPane.showMessageDialog(
179
                    ApplicationLocator.getManager().getRootComponent(),
180
                    Messages.getText("_No_output_format_available"),
181
                    Messages.getText("legend"),
182
                    JOptionPane.WARNING_MESSAGE);
183
                return;
184
            }
185

  
144 186
            ILegend legend = activePanel.getLegend();
145

  
146
            PersistenceManager manager = ToolsLocator.getPersistenceManager();
187
            MapContextManager mcoman = MapContextLocator.getMapContextManager();
188
            
147 189
            JFileChooser fileChooser = new JFileChooser();
148 190
            fileChooser.setAcceptAllFileFilterUsed(false);
191
            
192
            for (int i=0; i<filters.size(); i++) {
193
                fileChooser.addChoosableFileFilter(filters.get(i));
194
            }
149 195

  
150
            fileChooser.setFileFilter(new FileFilter() {
151

  
152
                @Override
153
                public String getDescription() {
154
                    return "Legend files (*"
155
                        + SymbolManager.LEGEND_FILE_EXTENSION + ")";
196
            if (fileChooser.showSaveDialog(
197
                ApplicationLocator.getManager().getRootComponent())
198
                == JFileChooser.APPROVE_OPTION) {
199
                
200
                LegendFileFilter lff = (LegendFileFilter) fileChooser.getFileFilter();
201
                
202
                File selfile = fileChooser.getSelectedFile();
203
                if (!selfile.getAbsolutePath().toLowerCase().endsWith(
204
                    "." + lff.getFileExtension().toLowerCase())) {
205
                    
206
                    selfile = new File(selfile.getAbsolutePath() +
207
                        "." + lff.getFileExtension().toLowerCase());
156 208
                }
157

  
158
                @Override
159
                public boolean accept(File f) {
160
                    if (f.isDirectory()) {
161
                        return true;
162
                    } else
163
                        if (f.isFile() && getExtension(f) != null) {
164
                            return getExtension(f).equals(
165
                                SymbolManager.LEGEND_FILE_EXTENSION);
166
                        } else {
167
                            return false;
168
                        }
209
                
210
                ILegendWriter lw = null;
211
                lw = mcoman.createLegendWriter(legend.getClass(), lff.getFileExtension());
212
                
213
                if (lw == null) {
214
                    throw new WriteLegendException(legend,
215
                        new Exception("Unable to create legend writer."));
216
                } else {
217
                    lw.write(legend, selfile, lff.getFileExtension());
169 218
                }
170
            });
219
            }
220
        }
171 221

  
172
            if (fileChooser.showSaveDialog((Component) PluginServices
173
                .getMainFrame()) == JFileChooser.APPROVE_OPTION) {
174
                OutputStream os;
175
                File selectedFile = fileChooser.getSelectedFile();
176

  
177
                if (getExtension(selectedFile) == null
178
                    || !getExtension(selectedFile).equals(
179
                        SymbolManager.LEGEND_FILE_EXTENSION)) {
180
                    File selectedFileWithExtension =
181
                        new File(selectedFile.getAbsolutePath()
182
                            + SymbolManager.LEGEND_FILE_EXTENSION);
183
                    selectedFile = selectedFileWithExtension;
222
        /**
223
         * 
224
         * @param writing true for writing; false for reading
225
         * @return
226
         */
227
        private List<LegendFileFilter> getLegendFileFilters(boolean writing) {
228
            
229
            List<LegendFileFilter> resp = new ArrayList<LegendFileFilter>();
230
            MapContextManager mcoman = MapContextLocator.getMapContextManager();
231
            List wformats = null;
232
            
233
            if (writing) {
234
                wformats = mcoman.getLegendWritingFormats();
235
            } else {
236
                wformats = mcoman.getLegendReadingFormats();
237
            }
238
            
239
            String fmt = null;
240
            for (int i=0; i<wformats.size(); i++) {
241
                fmt = (String) wformats.get(i);
242
                fmt = getFileExtension(fmt);
243
                if (fmt != null) {
244
                    resp.add(new LegendFileFilter(fmt));
184 245
                }
185

  
186
                try {
187
                    os = new FileOutputStream(selectedFile);
188
                } catch (FileNotFoundException e) {
189
                    JOptionPane.showMessageDialog(null,
190
                        "_cant_open_the_input_file_legend");
191
                    return;
246
            }
247
            return resp;
248
        }
249
        
250
        
251
        /**
252
         * Returns null if mime format is not parsed properly
253
         * 
254
         * @param fmt MIME format
255
         * 
256
         * @return
257
         */
258
        private String getFileExtension(String fmt) {
259
            // Example: "text/xml; subtype=gml/2.1.2" => "gml"
260
            if (fmt == null) {
261
                return null;
262
            }
263
            String[] parts = fmt.split(";");
264
            String aux = "";
265
            if (parts.length > 1) {
266
                aux = parts[1].trim();
267
            } else {
268
                aux = parts[0].trim();
269
            }
270
            parts = aux.split("=");
271
            if (parts.length > 1) {
272
                aux = parts[1].trim();
273
                // Example: aux = "gml/2.1.2"
274
                parts = aux.split("/");
275
                return parts[0].length() == 0 ? null : parts[0].toLowerCase();
276
            } else {
277
                aux = parts[0].trim();
278
                // Example: "text/xml"
279
                parts = aux.split("/");
280
                if (parts.length > 1) {
281
                    return parts[1].length() == 0 ? null : parts[1].toLowerCase();
282
                } else {
283
                    return aux.length() == 0 ? null : aux.toLowerCase();
192 284
                }
285
            }
286
        }        
193 287

  
194
                manager.putObject(os, legend);
288
        private void loadLegend() throws Exception {
289
            
290
            List<LegendFileFilter> filters = getLegendFileFilters(false);
291
            if (filters.size() == 0) {
292
                JOptionPane.showMessageDialog(
293
                    ApplicationLocator.getManager().getRootComponent(),
294
                    Messages.getText("_No_input_format_available"),
295
                    Messages.getText("legend"),
296
                    JOptionPane.WARNING_MESSAGE);
297
                return;
195 298
            }
196
        }
197 299

  
198
        private void loadLegend() {
199

  
200 300
            JFileChooser fileChooser = new JFileChooser();
201 301
            fileChooser.setAcceptAllFileFilterUsed(false);
302
            
303
            for (int i=0; i<filters.size(); i++) {
304
                fileChooser.addChoosableFileFilter(filters.get(i));
305
            }
202 306

  
203
            // fileChooser filter
204
            fileChooser.setFileFilter(new FileFilter() {
205

  
206
                @Override
207
                public String getDescription() {
208
                    // get this extension from manager or somewhere!
209

  
210
                    return "Legend files (*"
211
                        + SymbolManager.LEGEND_FILE_EXTENSION + ")";
212
                }
213

  
214
                @Override
215
                public boolean accept(File f) {
216
                    if (f.isDirectory()) {
217
                        return true;
218
                    } else
219
                        if (f.isFile() && getExtension(f) != null) {
220

  
221
                            return getExtension(f).equals(
222
                                SymbolManager.LEGEND_FILE_EXTENSION);
223
                        } else {
224
                            return false;
225
                        }
226
                }
227
            });
228

  
229 307
            // open a file
230 308
            if (fileChooser.showOpenDialog((Component) PluginServices
231 309
                .getMainFrame()) == JFileChooser.APPROVE_OPTION) {
310
                
232 311
                File file = fileChooser.getSelectedFile();
233
                PersistenceManager manager =
234
                    ToolsLocator.getPersistenceManager();
235
                InputStream is;
236

  
237
                try {
238
                    is = new FileInputStream(file);
239
                } catch (FileNotFoundException e) {
240
                    JOptionPane.showMessageDialog(null,
241
                        "_cant_open_the_input_file_legend");
242
                    return;
243
                }
244
                ILegend legend = (ILegend) manager.getObject(is);
245
                applyLegend(legend);
312
                LegendFileFilter lff = (LegendFileFilter) fileChooser.getFileFilter();
313
                MapContextManager mcoman = MapContextLocator.getMapContextManager();
314
                ILegendReader lr = mcoman.createLegendReader(lff.getFileExtension());
315
                
316
                ILegend leg = lr.read(file, Geometry.TYPES.GEOMETRY);
317
                applyLegend(leg);
246 318
            }
247 319
        }
248 320
    };

Also available in: Unified diff