Statistics
| Revision:

svn-gvsig-desktop / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / MySelectionByThemeListener.java @ 931

History | View | Annotate | Download (6.69 KB)

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

    
3
import java.util.BitSet;
4

    
5
import com.iver.andami.messages.NotificationManager;
6
import com.iver.cit.gvsig.fmap.DriverException;
7
import com.iver.cit.gvsig.fmap.core.FGeometry;
8
import com.iver.cit.gvsig.fmap.core.FShape;
9
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
10
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
11
import com.iver.cit.gvsig.fmap.layers.FBitSet;
12
import com.iver.cit.gvsig.fmap.layers.FLayer;
13
import com.iver.cit.gvsig.fmap.layers.FLayers;
14
import com.iver.cit.gvsig.fmap.layers.VectorialAdapter;
15
import com.iver.cit.gvsig.fmap.layers.layerOperations.Selectable;
16
import com.iver.cit.gvsig.fmap.layers.layerOperations.SingleLayer;
17
import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData;
18
import com.iver.cit.gvsig.fmap.operations.strategies.QueryByThemeVisitor;
19
import com.iver.cit.gvsig.fmap.operations.strategies.VisitException;
20
import com.vividsolutions.jts.geom.Geometry;
21
import com.vividsolutions.jts.geom.IntersectionMatrix;
22

    
23

    
24
/**
25
 * DOCUMENT ME!
26
 *
27
 * @author Fernando Gonz?lez Cort?s
28
 */
29
public class MySelectionByThemeListener implements SelectionByThemeListener {
30
    private FLayers layers;
31

    
32
    /**
33
     * Creates a new MySelectionByThemeListener object.
34
     *
35
     * @param layers DOCUMENT ME!
36
     */
37
    public MySelectionByThemeListener(FLayers layers) {
38
        this.layers = layers;
39
    }
40

    
41
    /**
42
     * DOCUMENT ME!
43
     *
44
     * @param toSelect DOCUMENT ME!
45
     * @param selectionLayer DOCUMENT ME!
46
     * @param action DOCUMENT ME!
47
     */
48
    private void doSelection(FLayer[] toSelect, FLayer selectionLayer, int action, boolean bFromSet) {
49
            SingleLayer capaBase = (SingleLayer) selectionLayer;
50
            Selectable selecBase = (Selectable) capaBase;
51
            BitSet bitSetBase = selecBase.getSelection();
52
        VectorialAdapter adapterBase = capaBase.getSource();  
53

    
54
        for (int i = 0; i < toSelect.length; i++) {
55
            FLayer capa = toSelect[i];
56
            if (capa instanceof Selectable) {
57
                    Selectable seleccionada = (Selectable) capa;
58
                    VectorialAdapter adapterSelec = ((SingleLayer) capa).getSource();
59
                    BitSet bitSet = seleccionada.getSelection();
60
                int index = bitSetBase.nextSetBit(0);
61
                while (index != -1) {
62
                        FGeometry s1;
63
                                        try {
64
                                                s1 = (FGeometry) adapterBase.getShape(index);
65
                                                Geometry g1 = s1.toJTSGeometry();
66
                            for (int j = 0; j < adapterSelec.getShapeCount(); j++) {
67
                                    
68
                                    if (bFromSet)
69
                                    {
70
                                            if (bitSet.get(j)== false)
71
                                                    continue;
72
                                            bitSet.set(j, false); // Por defecto limpiamos
73
                                    }
74
                                            
75
                                    
76
                                    FGeometry s2 = (FGeometry) adapterSelec.getShape(j);
77
                                Geometry g2 = s2.toJTSGeometry();
78
                                IntersectionMatrix m = g2.relate(g1);
79
        
80
                                switch (action) {
81
                                case SelectionByTheme.CONTAINS:
82
                                    if (m.isContains()) {
83
                                        bitSet.set(j, true);
84
                                    }
85
                                    break;
86
        
87
                                case SelectionByTheme.CROSSES:
88
        
89
                                    if (m.isCrosses(g1.getDimension(), g2.getDimension())) {
90
                                            bitSet.set(j, true);
91
                                    }
92
        
93
                                    break;
94
        
95
                                case SelectionByTheme.DISJOINT:
96
                                    if (m.isDisjoint()) {
97
                                            bitSet.set(j, true);
98
                                    }
99
                                    break;
100
        
101
                                case SelectionByTheme.EQUALS:
102
                                    if (m.isEquals(g1.getDimension(), g2.getDimension())) {
103
                                            bitSet.set(j, true);
104
                                    }
105
        
106
                                    break;
107
        
108
                                case SelectionByTheme.INTERSECTS:
109
        
110
                                    if (m.isIntersects()) {
111
                                            bitSet.set(j, true);
112
                                    }
113
        
114
                                    break;
115
        
116
                                case SelectionByTheme.OVERLAPS:
117
        
118
                                    if (m.isOverlaps(g1.getDimension(),
119
                                                g2.getDimension())) {
120
                                            bitSet.set(j, true);
121
                                    }
122
        
123
                                    break;
124
        
125
                                case SelectionByTheme.TOUCHES:
126
        
127
                                    if (m.isTouches(g1.getDimension(), g2.getDimension())) {
128
                                            bitSet.set(j, true);
129
                                    }
130
        
131
                                    break;
132
        
133
                                case SelectionByTheme.WITHIN:
134
                                    if (m.isWithin()) {
135
                                            bitSet.set(j, true);
136
                                    }
137
        
138
                                    break;
139
                                }
140
                            } // for
141
                                        } catch (DriverIOException e) {
142
                                                // TODO Auto-generated catch block
143
                                                e.printStackTrace();
144
                                        }
145

    
146
                    index = bitSetBase.nextSetBit(index + 1);
147
                }
148
                // seleccionada.setSelected(0, seleccionada.isSelected(0), false);
149
            }
150
        }
151
    }
152

    
153
    /**
154
     * @see com.iver.cit.gvsig.gui.SelectionByThemeListener#newSet(int, int,
155
     *      int)
156
     */
157
    public void newSet(FLayer[] toSelect, FLayer selectionLayer, int action) {
158
        for (int i = 0; i < toSelect.length; i++) {
159
                Selectable capa = (Selectable) toSelect[i];
160
            QueryByThemeVisitor visitor = new QueryByThemeVisitor(toSelect[i], selectionLayer, action);
161
            capa.clearSelection();
162
            try {
163
                                ((VectorialData) selectionLayer).process(visitor, ((Selectable)selectionLayer).getSelection());
164
                                ((Selectable) toSelect[i]).setSelection(visitor.getBitset());
165
                        } catch (DriverException e) {
166
                                NotificationManager.addError("Error leyendo las capas", e);
167
                        } catch (VisitException e) {
168
                                NotificationManager.addError("Error leyendo las capas", e);
169
                        }
170
        }
171
//        doSelection(toSelect, selectionLayer, action, false);
172
    }
173

    
174
    /**
175
     * @see com.iver.cit.gvsig.gui.SelectionByThemeListener#addToSet(int,
176
     *      int, int)
177
     */
178
    public void addToSet(FLayer[] toSelect, FLayer selectionLayer, int action) {
179
        doSelection(toSelect, selectionLayer, action, false);
180
    }
181

    
182
    /**
183
     * @see com.iver.cit.gvsig.gui.SelectionByThemeListener#fromSet(int, int,
184
     *      int)
185
     */
186
    public void fromSet(FLayer[] toSelect, FLayer selectionLayer, int action) {
187
            doSelection(toSelect, selectionLayer, action, true);
188
    }
189
}