Statistics
| Revision:

svn-gvsig-desktop / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / toolListeners / InfoListener.java @ 969

History | View | Annotate | Download (6.65 KB)

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

    
3
import java.awt.Cursor;
4
import java.awt.Image;
5
import java.awt.Point;
6
import java.awt.Toolkit;
7
import java.awt.geom.Point2D;
8
import java.util.BitSet;
9

    
10
import javax.swing.ImageIcon;
11
import javax.swing.JDialog;
12
import javax.swing.tree.DefaultMutableTreeNode;
13
import javax.swing.tree.DefaultTreeModel;
14
import javax.swing.tree.TreePath;
15

    
16
import org.apache.log4j.Logger;
17
import org.xml.sax.ContentHandler;
18
import org.xml.sax.SAXException;
19
import org.xml.sax.helpers.AttributesImpl;
20

    
21
import com.hardcode.gdbms.engine.data.DataSource;
22
import com.iver.andami.PluginServices;
23
import com.iver.andami.messages.NotificationManager;
24
import com.iver.cit.gvsig.fmap.DriverException;
25
import com.iver.cit.gvsig.fmap.NewMapControl;
26
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
27
import com.iver.cit.gvsig.fmap.layers.FLayer;
28
import com.iver.cit.gvsig.fmap.layers.layerOperations.AlphanumericData;
29
import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData;
30
import com.iver.cit.gvsig.fmap.operations.QueriedPoint;
31
import com.iver.cit.gvsig.fmap.operations.strategies.QueryByPointVisitor;
32
import com.iver.cit.gvsig.fmap.operations.strategies.VisitException;
33
import com.iver.cit.gvsig.fmap.tools.BehaviorException;
34
import com.iver.cit.gvsig.fmap.tools.Events.PointEvent;
35
import com.iver.cit.gvsig.fmap.tools.Listeners.PointListener;
36
import com.iver.cit.gvsig.gui.Dialogs.FInfoDialogXML;
37
import com.iver.utiles.xmlViewer.XMLContent;
38

    
39

    
40
/**
41
 * DOCUMENT ME!
42
 *
43
 * @author Vicente Caballero Navarro
44
 */
45
public class InfoListener implements PointListener {
46
        // private final Image img = new ImageIcon(NewMapControl.class.getResource(
47
        //"images/InfoCursor.png")).getImage();
48
        private static Logger logger = Logger.getLogger(InfoListener.class.getName());
49
        private final Image img = new ImageIcon(NewMapControl.class.getResource(
50
            "images/InfoCursor.gif")).getImage();
51
        private Cursor cur = Toolkit.getDefaultToolkit().createCustomCursor(img,
52
                        new Point(16, 16), "");
53
        private NewMapControl mapCtrl;
54
        private BitSet[] bitset;
55
        private FLayer[] layers;
56

    
57
        /**
58
         * Crea un nuevo AreaListenerImpl.
59
         *
60
         * @param mc DOCUMENT ME!
61
         */
62
        public InfoListener(NewMapControl mc) {
63
                this.mapCtrl = mc;
64
        }
65

    
66
        /**
67
         * DOCUMENT ME!
68
         *
69
         * @param event DOCUMENT ME!
70
         *
71
         * @throws DriverIOException
72
         *
73
         * @see com.iver.cit.gvsig.fmap.tools.Listeners.PointListener#point(com.iver.cit.gvsig.fmap.tools.Events.PointEvent)
74
         */
75
        public void point(PointEvent event) throws BehaviorException {
76
                Point2D pReal = mapCtrl.getMapContext().getViewPort().toMapPoint(event.getPoint());
77

    
78
                // Dentro de queryByPoint tenemos que separar los registros que vienen asociados a una 
79
                // capa o a otra. Supongo que lo correcto ser?a que montaramos un XML y usar el visor
80
                // de XML que ha empezado Fernando.
81
                // String strResul = m_MapControl.queryByPoint(pScreen,m_MapControl.toMapDistance(3),"");
82
                //FInfoDialog dlg = new FInfoDialog();
83
                //     dlg.clearAll();
84
                //   dlg.setViewModel((ProjectView) proj);
85
                FInfoDialogXML dlgXML = new FInfoDialogXML();
86

    
87
                //MultipleXMLContent xmlModel = new MultipleXMLContent();                
88

    
89
                FLayer[] sel = mapCtrl.getMapContext().getLayers().getActives();
90

    
91
                bitset = new BitSet[sel.length];
92
                layers = new FLayer[sel.length];
93

    
94
                for (int i = 0; i < sel.length; i++) {
95
                        FLayer laCapa = (FLayer) sel[i];
96

    
97
                        if ((laCapa instanceof VectorialData) &&
98
                                        (laCapa instanceof AlphanumericData)){
99
                                QueryByPointVisitor visitor = new QueryByPointVisitor();
100
                                visitor.setLayer(laCapa);
101
                                visitor.setQueriedPoint(new QueriedPoint(
102
                                                pReal.getX(), pReal.getY()));
103
                                visitor.setTolerance(mapCtrl.getMapContext().getViewPort().toMapDistance(3));
104
                                try {
105
                                        ((VectorialData) laCapa).process(visitor);
106
                                } catch (DriverException e) {
107
                                        throw new BehaviorException("No se pudo procesar la capa", e);
108
                                } catch (VisitException e) {
109
                                        throw new RuntimeException(e);
110
                                }
111

    
112
                                bitset[i] = visitor.getBitSet();
113
                                layers[i] = laCapa;
114
                        }
115
                }
116

    
117
                if (bitset != null) {
118
                        try {
119
                                if (PluginServices.getMainFrame() == null)
120
                                {
121
                                        JDialog dialog = new JDialog();
122
                                        dlgXML.setPreferredSize(dlgXML.getSize());
123
                                        dialog.getContentPane().add(dlgXML);
124
                                        dialog.setModal(false);                        
125
                                        dialog.pack();
126
                                        dialog.show();
127
                                        
128
                                }
129
                                else
130
                                {
131
                                        // dlgXML = (FInfoDialogXML) 
132
                                        PluginServices.getMDIManager().addView(dlgXML);
133
                                }
134
                                
135
                                dlgXML.setModel(new XMLContent() {
136
                                        private ContentHandler handler;
137

    
138
                                        public void setContentHandler(ContentHandler arg0) {
139
                                                handler = arg0;
140
                                        }
141

    
142
                                        public void parse() throws SAXException {
143
                                                handler.startDocument();
144

    
145
                                                for (int i = 0; i < bitset.length; i++) {
146
                                                        AttributesImpl aii = new AttributesImpl();
147
                                                        handler.startElement("", "",
148
                                                                ((FLayer) layers[i]).getName(), aii);
149

    
150
                                                        try {
151
                                                                DataSource ds = ((AlphanumericData) layers[i]).getRecordset();
152
                                                                ds.start();
153

    
154
                                                                for (int j = bitset[i].nextSetBit(0);
155
                                                                                j >= 0;
156
                                                                                j = bitset[i].nextSetBit(j + 1)) {
157
                                                                        // for (int j = 0; j < bitset[i].length();
158
                                                                        //        j++) {
159
                                                                        //if (bitset[i].get(j)) {
160
                                                                        AttributesImpl ai = new AttributesImpl();
161

    
162
                                                                        for (int k = 0; k < ds.getFieldCount();
163
                                                                                        k++) {
164
                                                                                ai.addAttribute("",
165
                                                                                        ds.getFieldName(k), "",
166
                                                                                        "xs:string",
167
                                                                                        ds.getFieldValue(j, k).toString());
168
                                                                        }
169

    
170
                                                                        handler.startElement("", "",
171
                                                                                String.valueOf(j), ai);
172

    
173
                                                                        handler.endElement("", "",
174
                                                                                String.valueOf(j));
175

    
176
                                                                }
177

    
178
                                                                logger.debug("ds.stop()");
179
                                                                ds.stop();
180
                                                        } catch (com.hardcode.gdbms.engine.data.DriverException e) {
181
                                                                throw new SAXException(e);
182
                                                        } catch (DriverException e) {
183
                                                                throw new SAXException(e);
184
                                                        }
185

    
186
                                                        handler.endElement("", "",
187
                                                                ((FLayer) layers[i]).getName());
188
                                                }
189

    
190
                                                handler.endDocument();
191
                                        }
192
                                });
193
                                dlgXML.getXmlTree().setRootVisible(false);
194
                                DefaultTreeModel treeModel = (DefaultTreeModel) dlgXML.getXmlTree().getModel();
195
                        DefaultMutableTreeNode n;
196
                        DefaultMutableTreeNode root = (DefaultMutableTreeNode) dlgXML.getXmlTree().getModel().getRoot();
197
                                n = root.getFirstLeaf();
198
                                TreePath path = new TreePath(treeModel.getPathToRoot(n));
199
                                dlgXML.getXmlTree().expandPath(path);
200
                        
201
                                dlgXML.getXmlTree().setSelectionPath(path);
202

    
203
                        } catch (SAXException e) {
204
                                NotificationManager.addError("Error formateando los resultados", e);
205
                        }
206
                }
207

    
208
        }
209

    
210
        /**
211
         * @see com.iver.cit.gvsig.fmap.tools.Listeners.ToolListener#getCursor()
212
         */
213
        public Cursor getCursor() {
214
                return cur;
215
        }
216

    
217
        /**
218
         * @see com.iver.cit.gvsig.fmap.tools.Listeners.ToolListener#cancelDrawing()
219
         */
220
        public boolean cancelDrawing() {
221
                return false;
222
        }
223
}