Statistics
| Revision:

root / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / dialogs / InfoToolViewer.java @ 6797

History | View | Annotate | Download (8.34 KB)

1
package com.iver.cit.gvsig.gui.dialogs;
2

    
3
import java.awt.Dimension;
4
import java.awt.event.ComponentEvent;
5
import java.awt.event.ComponentListener;
6
import java.util.Vector;
7
import javax.swing.JList;
8
import javax.swing.JPanel;
9
import javax.swing.event.ListSelectionListener;
10
import javax.swing.tree.DefaultMutableTreeNode;
11
import javax.swing.tree.DefaultTreeModel;
12
import javax.swing.tree.TreePath;
13
import org.xml.sax.ContentHandler;
14
import org.xml.sax.SAXException;
15

    
16
import com.iver.cit.gvsig.fmap.layers.FLayer;
17
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
18
import com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint;
19
import com.iver.cit.gvsig.fmap.layers.layerOperations.XMLItem;
20
import com.iver.cit.gvsig.gui.dialogs.FInfoDialogXML;
21
import com.iver.cit.gvsig.gui.wizards.FormatListModel;
22
import com.iver.utiles.xmlViewer.XMLContent;
23

    
24
/**
25
 * This is the generic Feature Info Viewer
26
 * 
27
 * If the feature Info comes from a special layer which has registered
28
 * the way to visualize itself, adds a panel that the layer should provide
29
 * otherwise this viewer will add a panel to visualize HTML or a special
30
 * viewer to show XML.
31
 * 
32
 * @author laura
33
 *
34
 */
35
public class InfoToolViewer extends JPanel {
36
        
37
    private javax.swing.JScrollPane jScrollPane = null;
38
    private JList layerList = null;
39
    private javax.swing.JSplitPane jSplitPane1 = null;
40
    private javax.swing.JPanel layerListPanel = null;
41
        private JPanel infoViewerPanel;        
42
        private XMLItem[] m_layers;
43
        IInfoToolPanel infoPanel = null;
44

    
45
    /**
46
     * This is the default constructor
47
     */
48
    public InfoToolViewer() {
49
        super();
50
        initialize();
51
        this.addComponentListener(new componentListener());
52
    }
53
    
54
    public InfoToolViewer(XMLItem[] layers) {
55
            super();
56
            initialize();
57
            setLayers(layers);
58
    }
59
    
60
    public void setLayers(XMLItem[] layers){            
61
            m_layers = layers;
62
            initilizeLayerListModel();
63
            updateViewer(0);
64
            layerList.setSelectedIndex(0);
65
    }
66

    
67

    
68
    /**
69
     * This method initializes this
70
     */
71
    private void initialize() {
72
        this.setLayout(new java.awt.BorderLayout());
73
        this.add(getJSplitPane1(), java.awt.BorderLayout.CENTER);
74
        this.setSize(600, 600);
75
        this.setPreferredSize(new Dimension(600, 600));
76
    }
77

    
78
    /**
79
     * This method initializes jScrollPane
80
     *
81
     * @return javax.swing.JScrollPane
82
     */
83
    private javax.swing.JScrollPane getJScrollPane() {
84
        if (jScrollPane == null) {
85
            jScrollPane = new javax.swing.JScrollPane();
86
            jScrollPane.setSize(new Dimension(600,600));
87
            jScrollPane.setPreferredSize( new Dimension(600,600));
88
            jScrollPane.setViewportView(getLayerListPanel());
89
        }
90

    
91
        return jScrollPane;
92
    }
93
    
94
    private void initilizeLayerListModel() {
95
        Vector layerNames = new Vector();
96
        if (m_layers != null)
97
        {
98
                for (int i = 0; i < m_layers.length; i++)
99
                {
100
                        layerNames.add(m_layers[i].getLayer().getName());
101
                }                
102
        }         
103
        
104
        FormatListModel model = new FormatListModel((String[])layerNames.toArray(new String[0])); 
105
        getJList().setModel(model);            
106
    }
107

    
108
    public JList getJList(){
109

    
110
          if (layerList == null) {
111
                  layerList = new JList();
112
                  initilizeLayerListModel();
113
              layerList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
114
          }
115
  
116
      layerList.addListSelectionListener(new ListSelectionListener() { 
117
                                public void valueChanged(javax.swing.event.ListSelectionEvent e) {
118
                                  int changedIdx = layerList.getSelectedIndex();//e.getFirstIndex();
119
                                 
120
                                  if (changedIdx == -1) return;
121
                                  updateViewer(changedIdx);
122
                   }
123
          });    
124
      return layerList;
125
}
126
    /**
127
     * This method initializes jSplitPane1
128
     *
129
     * @return javax.swing.JSplitPane
130
     */
131
    private javax.swing.JSplitPane getJSplitPane1() {
132
        if (jSplitPane1 == null) {
133
            jSplitPane1 = new javax.swing.JSplitPane();
134
            jSplitPane1.setLeftComponent(getJScrollPane());
135
            jSplitPane1.setRightComponent(getInfoViewerPanel());
136
            jSplitPane1.setDividerSize(4);
137
            jSplitPane1.setDividerLocation(100);
138
            jSplitPane1.setSize( new Dimension(600,600));
139
            jSplitPane1.setPreferredSize( new Dimension(600,600));
140
        }
141
        return jSplitPane1;
142
    }
143

    
144
    /**
145
     * This method initializes jPanel
146
     *
147
     * @return javax.swing.JPanel
148
     */
149
    private javax.swing.JPanel getLayerListPanel() {
150
        if (layerListPanel == null) {
151
            layerListPanel = new javax.swing.JPanel();
152
            layerListPanel.setLayout(new java.awt.BorderLayout());
153
            layerListPanel.add(getJList(), java.awt.BorderLayout.CENTER);
154
        }
155

    
156
        return layerListPanel;
157
    }
158

    
159
    /**
160
     * This method initializes jPanel1
161
     *
162
     * @return javax.swing.JPanel
163
     */
164
    private javax.swing.JPanel getInfoViewerPanel() {
165
        if (infoViewerPanel == null) {
166
            infoViewerPanel = new javax.swing.JPanel();
167
            infoViewerPanel.setLayout(new java.awt.BorderLayout());
168
        }
169
        validate();
170
        return infoViewerPanel;
171
    } 
172
    
173
    /**
174
     * updates the layer to display
175
     *
176
     */
177
    private void updateViewer(int changedIdx)
178
    {
179
            if((m_layers == null) || (m_layers.length == 0)) return;              
180
                  final XMLItem item = m_layers[changedIdx];
181
                  FLayer layer = item.getLayer(); 
182
                
183
                  if (layer instanceof InfoByPoint){                                                                          
184
                          FLyrDefault defaultLayer = (FLyrDefault)layer;
185
                          if (defaultLayer.getProperty("customPanel") != null){
186
                                  
187
                                  Class c = (Class)defaultLayer.getProperty("customPanel");
188
                                  
189
                                try {
190
                                        infoPanel = (IInfoToolPanel)c.newInstance();
191
                                } catch (InstantiationException e1) {
192
                                        e1.printStackTrace();
193
                                } catch (IllegalAccessException e1) {
194
                                        e1.printStackTrace();
195
                                }
196
                                  
197
                          infoViewerPanel.removeAll();
198
                          infoViewerPanel.add((JPanel)infoPanel);
199
                          infoPanel.show(item.toString());
200
                          
201
                          infoViewerPanel.setVisible( true ); 
202
                          revalidate();
203

    
204
                          }
205
                          else {
206
                                  
207
                                  if (item.toString().toLowerCase().endsWith( "</html>"))//if (item.toString().toLowerCase().startsWith( "<html>"))
208
                                  {
209
                                          //skip the header info
210
                                          IInfoToolPanel htmlPanel = new HTMLInfoToolPanel();
211
                                         
212
                                          int idx = item.toString().toLowerCase().indexOf("<html");
213
                                          if (idx != -1){
214
                                                  htmlPanel.show(item.toString().substring(idx));                                          
215
                                          }else{
216
                                                  htmlPanel.show(item.toString());
217
                                          }
218
                                          infoViewerPanel.removeAll();
219
                                          infoViewerPanel.add((JPanel)htmlPanel);
220
                                          infoViewerPanel.setVisible( true );                                                           
221
                                          revalidate();
222
                                  }
223
                                  else
224
                                  {
225
                                          FInfoDialogXML dlgXML = new FInfoDialogXML();
226
                                                try {
227
                                                        dlgXML.setModel(new XMLContent() {
228
                                                                private ContentHandler handler;
229

    
230
                                                                public void setContentHandler(ContentHandler arg0) {
231
                                                                        handler = arg0;
232
                                                                }
233

    
234
                                                                public void parse() throws SAXException {
235
                                                                        handler.startDocument();
236
                                                                        item.parse( handler);
237
                                                                        handler.endDocument();
238
                                                                }
239
                                                        });
240
                                                } catch (SAXException e1) {
241
                                                        // TODO Auto-generated catch block
242
                                                        e1.printStackTrace();
243
                                                }
244
                                                dlgXML.getXmlTree().setRootVisible(false);
245
                                                DefaultTreeModel treeModel = (DefaultTreeModel) dlgXML
246
                                                                .getXmlTree().getModel();
247
                                                DefaultMutableTreeNode n;
248
                                                DefaultMutableTreeNode root = (DefaultMutableTreeNode) dlgXML
249
                                                                .getXmlTree().getModel().getRoot();
250
                                                n = root.getFirstLeaf();
251
                                                TreePath path = new TreePath(treeModel.getPathToRoot(n));
252
                                                dlgXML.getXmlTree().expandPath(path);
253
                                                dlgXML.getXmlTree().setSelectionPath(path);
254
                                                //dlgXML.
255
                                                
256
                                                infoViewerPanel.removeAll();
257
                                                infoViewerPanel.add(dlgXML);
258
                                                infoViewerPanel.setVisible( true ); 
259
                                                this.validate();
260
                                            this.doLayout();        
261
                                  }
262
                          }
263
                  }            
264
    }
265
    
266
    class componentListener implements ComponentListener{
267

    
268
                public void componentHidden(ComponentEvent e) {
269
                        // TODO Auto-generated method stub
270
                        
271
                }
272

    
273
                public void componentMoved(ComponentEvent e) {
274
                        // TODO Auto-generated method stub
275
                        
276
                }
277

    
278
                public void componentResized(ComponentEvent e) {
279
                        
280
                        //if (e.getComponent() == )
281
                        if (infoPanel != null){
282
                                infoPanel.refreshSize();
283
                        }
284
                        
285
                        
286
                }
287

    
288
                public void componentShown(ComponentEvent e) {
289
                        // TODO Auto-generated method stub
290
                        
291
                }
292
            
293
    }
294
}