Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.gui / src / main / java / es / unex / sextante / gui / additionalResults / AdditionalResultsDialog.java @ 119

History | View | Annotate | Download (15.1 KB)

1

    
2

    
3
package es.unex.sextante.gui.additionalResults;
4

    
5
import java.awt.BorderLayout;
6
import java.awt.Component;
7
import java.awt.Dimension;
8
import java.awt.Frame;
9
import java.awt.event.ActionEvent;
10
import java.awt.event.ActionListener;
11
import java.awt.event.MouseAdapter;
12
import java.awt.event.MouseEvent;
13
import java.awt.event.MouseListener;
14
import java.io.BufferedWriter;
15
import java.io.File;
16
import java.io.FileWriter;
17
import java.util.ArrayList;
18
import java.util.Enumeration;
19

    
20
import javax.swing.JDialog;
21
import javax.swing.JFileChooser;
22
import javax.swing.JMenuItem;
23
import javax.swing.JOptionPane;
24
import javax.swing.JPanel;
25
import javax.swing.JPopupMenu;
26
import javax.swing.JScrollPane;
27
import javax.swing.JSplitPane;
28
import javax.swing.JTable;
29
import javax.swing.JTextPane;
30
import javax.swing.JTree;
31
import javax.swing.ScrollPaneConstants;
32
import javax.swing.table.TableModel;
33
import javax.swing.tree.DefaultMutableTreeNode;
34
import javax.swing.tree.DefaultTreeModel;
35
import javax.swing.tree.TreePath;
36

    
37
import org.jfree.chart.ChartPanel;
38
import org.jfree.chart.ChartUtilities;
39

    
40
import es.unex.sextante.core.ObjectAndDescription;
41
import es.unex.sextante.core.Sextante;
42
import es.unex.sextante.gui.algorithm.GenericFileFilter;
43

    
44

    
45
public class AdditionalResultsDialog
46
         extends
47
            JDialog {
48

    
49
   private JSplitPane  jSplitPane;
50
   private JTree       jTree;
51
   private TreePath    m_Path;
52
   private JScrollPane jScrollPane;
53
   private JMenuItem   menuItemSave;
54
   private JPopupMenu  popupMenu;
55
   private JMenuItem   menuItemRemove;
56
   private JMenuItem   menuItemRename;
57

    
58

    
59
   public AdditionalResultsDialog(final ArrayList components,
60
                                  final Frame mainFrame) {
61

    
62
      super(mainFrame, Sextante.getText("Result"), true);
63

    
64
      initGUI(components);
65
      setLocationRelativeTo(null);
66

    
67
   }
68

    
69

    
70
   private boolean initGUI(final ArrayList components) {
71

    
72
      final JPanel panel = new JPanel();
73
      final BorderLayout thisLayout = new BorderLayout();
74
      panel.setLayout(thisLayout);
75
      this.setContentPane(panel);
76

    
77
      if (components.size() == 0) {
78
         return false;
79
      }
80
      try {
81
         {
82
            this.setPreferredSize(new java.awt.Dimension(700, 350));
83
            this.setSize(new java.awt.Dimension(700, 350));
84
            {
85
               jSplitPane = new JSplitPane();
86
               panel.add(jSplitPane, BorderLayout.CENTER);
87
               {
88
                  jTree = new JTree();
89
                  jTree.setCellRenderer(new AdditionalResultsTreeCellRenderer());
90
                  final MouseListener ml = new MouseAdapter() {
91
                     @Override
92
                     public void mousePressed(MouseEvent e) {
93
                        m_Path = jTree.getPathForLocation(e.getX(), e.getY());
94
                        showComponent();
95
                        if ((e.getButton() == MouseEvent.BUTTON3) && (m_Path != null)) {
96
                           DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
97
                           if (node.getUserObject() instanceof ObjectAndDescription) {
98
                              showPopupMenu(e);
99
                           }
100
                        }
101
                     }
102
                  };
103
                  jTree.addMouseListener(ml);
104

    
105
                  fillTree(components);
106

    
107
                  if (components.size() > 0) {
108
                     final DefaultMutableTreeNode node = findNode((ObjectAndDescription) components.get(components.size() - 1));
109
                     final DefaultTreeModel model = (DefaultTreeModel) jTree.getModel();
110
                     final TreePath path = new TreePath(model.getPathToRoot(node));
111
                     jTree.setSelectionPath(path);
112
                     jTree.scrollPathToVisible(path);
113
                     m_Path = path;
114
                     showComponent();
115
                  }
116

    
117
                  jScrollPane = new JScrollPane(jTree, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
118
                           ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
119

    
120
                  jScrollPane.setPreferredSize(new Dimension(200, 450));
121
                  jScrollPane.setMinimumSize(new Dimension(200, 450));
122
                  jScrollPane.setMaximumSize(new Dimension(200, 450));
123
               }
124
               {
125
                  jSplitPane.add(jScrollPane, JSplitPane.LEFT);
126
               }
127
            }
128
         }
129

    
130
         popupMenu = new JPopupMenu("Menu");
131

    
132
         menuItemSave = new JMenuItem(Sextante.getText("Save"));
133
         menuItemSave.addActionListener(new ActionListener() {
134
            public void actionPerformed(final ActionEvent evt) {
135
               if (m_Path != null) {
136
                  try {
137
                     final DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
138
                     if (node.getUserObject() instanceof ObjectAndDescription) {
139
                        save();
140
                     }
141
                  }
142
                  catch (final Exception e) {
143
                  }
144
               }
145
            }
146
         });
147
         popupMenu.add(menuItemSave);
148

    
149
         menuItemRemove = new JMenuItem(Sextante.getText("Remove"));
150
         menuItemRemove.addActionListener(new ActionListener() {
151
            public void actionPerformed(final ActionEvent evt) {
152
               if (m_Path != null) {
153
                  try {
154
                     final DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
155
                     if (node.getUserObject() instanceof ObjectAndDescription) {
156
                        remove();
157
                     }
158
                  }
159
                  catch (final Exception e) {
160
                  }
161
               };
162
            }
163
         });
164
         popupMenu.add(menuItemRemove);
165

    
166
         menuItemRename = new JMenuItem(Sextante.getText("Rename"));
167
         menuItemRename.addActionListener(new ActionListener() {
168
            public void actionPerformed(final ActionEvent evt) {
169
               if (m_Path != null) {
170
                  try {
171
                     final DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
172
                     if (node.getUserObject() instanceof ObjectAndDescription) {
173
                        rename();
174
                     }
175
                  }
176
                  catch (final Exception e) {
177
                  }
178
               };
179
            }
180

    
181
         });
182
         popupMenu.add(menuItemRename);
183

    
184
         panel.updateUI();
185
         return true;
186
      }
187
      catch (final Exception e) {
188
         Sextante.addErrorToLog(e);
189
         return false;
190
      }
191

    
192
   }
193

    
194

    
195
   protected void showPopupMenu(final MouseEvent e) {
196

    
197
      jTree.setSelectionPath(m_Path);
198

    
199
      final DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
200
      final ObjectAndDescription oad = (ObjectAndDescription) node.getUserObject();
201
      final Component c = (Component) oad.getObject();
202
      menuItemSave.setEnabled(true);
203
      popupMenu.show(e.getComponent(), e.getX(), e.getY());
204

    
205
   }
206

    
207

    
208
   private void rename() {
209

    
210
      if (m_Path != null) {
211
         try {
212
            final DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
213
            final ObjectAndDescription oad = (ObjectAndDescription) node.getUserObject();
214
            final String sName = oad.getDescription();
215

    
216
            final JOptionPane pane = new JOptionPane();
217
            pane.setMessage(Sextante.getText("introduce_nombre"));
218
            pane.setMessageType(JOptionPane.QUESTION_MESSAGE);
219
            pane.setWantsInput(true);
220
            pane.setInitialSelectionValue(sName);
221
            pane.setInputValue(sName);
222
            final JDialog dlg = pane.createDialog(null, Sextante.getText("renombrar"));
223
            dlg.setModal(true);
224
            dlg.setVisible(true);
225

    
226
            final String sNewName = pane.getInputValue().toString().trim();
227

    
228
            if ((sNewName != null) && (sNewName.length() != 0)) {
229
               oad.setDescription(sNewName);
230
            }
231

    
232
            update();
233
         }
234
         catch (final Exception e) {
235
         }
236
      }
237

    
238

    
239
   }
240

    
241

    
242
   protected void remove() {
243

    
244
      if (m_Path != null) {
245
         try {
246
            final DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
247
            final ObjectAndDescription oad = (ObjectAndDescription) node.getUserObject();
248
            AdditionalResults.removeComponent(oad);
249
            update();
250
         }
251
         catch (final Exception e) {
252
         }
253
      }
254

    
255
   }
256

    
257

    
258
   protected void save() {
259

    
260
      if (m_Path != null) {
261
         try {
262
            final DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
263
            final ObjectAndDescription oad = (ObjectAndDescription) node.getUserObject();
264
            final Component c = (Component) oad.getObject();
265
            if (c instanceof JScrollPane) {
266
               final JScrollPane pane = (JScrollPane) c;
267
               final Component view = pane.getViewport().getView();
268
               if (view instanceof JTextPane) {
269
                  final JTextPane text = (JTextPane) pane.getViewport().getView();
270
                  final JFileChooser fc = new JFileChooser();
271
                  fc.setFileFilter(new GenericFileFilter(new String[] { "htm" }, "HTML"));
272
                  final int returnVal = fc.showSaveDialog(this);
273
                  if (returnVal == JFileChooser.APPROVE_OPTION) {
274
                     try {
275
                        final File file = fc.getSelectedFile();
276
                        final FileWriter fileWriter = new FileWriter(file);
277
                        final BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
278
                        bufferedWriter.write(text.getText());
279
                        bufferedWriter.close();
280
                     }
281
                     catch (final Exception e) {
282
                        JOptionPane.showMessageDialog(null, "Could not save selected result", Sextante.getText("Warning"),
283
                                 JOptionPane.WARNING_MESSAGE);
284
                     }
285
                  }
286
               }
287
               else if (view instanceof JTable) {
288
                  final JTable table = (JTable) pane.getViewport().getView();
289
                  final TableModel model = table.getModel();
290
                  final JFileChooser fc = new JFileChooser();
291
                  fc.setFileFilter(new GenericFileFilter(new String[] { "csv" }, "Comma-Separated Values (csv)"));
292
                  final int returnVal = fc.showSaveDialog(this);
293
                  if (returnVal == JFileChooser.APPROVE_OPTION) {
294
                     try {
295
                        final File file = fc.getSelectedFile();
296
                        final FileWriter fileWriter = new FileWriter(file);
297
                        final BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
298
                        for (int j = 0; j < model.getColumnCount(); j++) {
299
                           bufferedWriter.write(model.getColumnName(j));
300
                           if (j == model.getColumnCount() - 1) {
301
                              bufferedWriter.write("\n");
302
                           }
303
                           else {
304
                              bufferedWriter.write(",");
305
                           }
306
                        }
307
                        for (int i = 0; i < model.getRowCount(); i++) {
308
                           for (int j = 0; j < model.getColumnCount(); j++) {
309
                              bufferedWriter.write(model.getValueAt(i, j).toString());
310
                              if (j == model.getColumnCount() - 1) {
311
                                 bufferedWriter.write("\n");
312
                              }
313
                              else {
314
                                 bufferedWriter.write(",");
315
                              }
316
                           }
317
                        }
318
                        bufferedWriter.close();
319
                     }
320
                     catch (final Exception e) {
321
                        JOptionPane.showMessageDialog(null, "Could not save selected result", Sextante.getText("Warning"),
322
                                 JOptionPane.WARNING_MESSAGE);
323
                     }
324
                  }
325
               }
326
            }
327
            else if (c instanceof ChartPanel) {
328
               final ChartPanel panel = (ChartPanel) c;
329
               final JFileChooser fc = new JFileChooser();
330
               fc.setFileFilter(new GenericFileFilter(new String[] { "png" }, "png"));
331
               final int returnVal = fc.showSaveDialog(this);
332
               if (returnVal == JFileChooser.APPROVE_OPTION) {
333
                  ChartUtilities.saveChartAsPNG(fc.getSelectedFile(), panel.getChart(), 600, 350);
334
               }
335
            }
336

    
337
         }
338
         catch (final Exception e) {
339
            Sextante.addErrorToLog(e);
340
         }
341
      }
342

    
343
   }
344

    
345

    
346
   protected void showComponent() {
347

    
348
      if (m_Path != null) {
349
         try {
350
            final DefaultMutableTreeNode node = (DefaultMutableTreeNode) m_Path.getLastPathComponent();
351
            final ObjectAndDescription oad = (ObjectAndDescription) node.getUserObject();
352
            final Component c = (Component) oad.getObject();
353
            c.setMinimumSize(new Dimension(300, 200));
354
            jSplitPane.setRightComponent(c);
355
         }
356
         catch (final Exception e) {
357
            Sextante.addErrorToLog(e);
358
         }
359

    
360
      }
361

    
362
   }
363

    
364

    
365
   public void fillTree(final ArrayList components) {
366

    
367
      DefaultMutableTreeNode node;
368
      final DefaultMutableTreeNode mainNode = new DefaultMutableTreeNode(Sextante.getText("Toolbox"));;
369
      final DefaultMutableTreeNode componentsNode = new DefaultMutableTreeNode(Sextante.getText("Result"));
370

    
371
      for (int i = 0; i < components.size(); i++) {
372
         node = new DefaultMutableTreeNode(components.get(i));
373
         componentsNode.add(node);
374
      }
375

    
376
      mainNode.add(componentsNode);
377

    
378
      jTree.setModel(new DefaultTreeModel(mainNode));
379

    
380
   }
381

    
382

    
383
   public void update() {
384

    
385
      if (!initGUI(AdditionalResults.getComponents())) {
386
         dispose();
387
         setVisible(false);
388
      }
389

    
390
   }
391

    
392

    
393
   private DefaultMutableTreeNode findNode(final ObjectAndDescription oad) {
394

    
395
      Object ob;
396
      final DefaultTreeModel data = (DefaultTreeModel) jTree.getModel();
397
      final DefaultMutableTreeNode root = (DefaultMutableTreeNode) data.getRoot();
398
      DefaultMutableTreeNode node = null;
399

    
400
      if (root != null) {
401
         for (final Enumeration e = root.breadthFirstEnumeration(); e.hasMoreElements();) {
402
            final DefaultMutableTreeNode current = (DefaultMutableTreeNode) e.nextElement();
403
            ob = current.getUserObject();
404
            if (ob instanceof ObjectAndDescription) {
405
               if (ob == oad) {
406
                  node = current;
407
                  break;
408
               }
409
            }
410
         }
411
      }
412

    
413
      return node;
414

    
415
   }
416

    
417
}