Revision 47476 trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.symbology/org.gvsig.symbology.lib/org.gvsig.symbology.lib.impl/src/main/java/org/gvsig/symbology/fmap/mapcontext/rendering/symbol/marker/impl/MultiLayerMarkerSymbol.java

View differences:

MultiLayerMarkerSymbol.java
30 30
import java.util.ArrayList;
31 31
import java.util.Arrays;
32 32
import java.util.List;
33

  
34 33
import org.gvsig.compat.print.PrintAttributes;
35 34
import org.gvsig.fmap.dal.feature.Feature;
36 35
import org.gvsig.fmap.geom.Geometry;
37 36
import org.gvsig.fmap.geom.primitive.Point;
38 37
import org.gvsig.fmap.mapcontext.MapContextLocator;
39 38
import org.gvsig.fmap.mapcontext.ViewPort;
39
import org.gvsig.fmap.mapcontext.rendering.symbols.CartographicSupport;
40 40
import org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol;
41 41
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
42
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolDrawingException;
43 42
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager;
44 43
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol;
44
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol_v2;
45 45
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMultiLayerMarkerSymbol;
46 46
import org.gvsig.tools.ToolsLocator;
47 47
import org.gvsig.tools.dynobject.DynStruct;
......
139 139
    }
140 140

  
141 141
    @Override
142
    public void draw(Graphics2D g, AffineTransform affineTransform,
143
            Geometry geom, Feature feature, Cancellable cancel) {
142
    public void draw(Graphics2D g, AffineTransform affineTransform, Geometry geom, Feature f, Cancellable cancel, Rectangle r) {
143
        if(r!=null){
144
            geom = this.getSampleGeometry(r);
145
        }
146

  
144 147
        Point p;
145 148
        try {
146 149
            p = geom.centroid();
......
150 153
        g.rotate(rotation, p.getX(), p.getY());
151 154
        for (int i = 0; (cancel == null || !cancel.isCanceled())
152 155
                && layers != null && i < layers.length; i++) {
153
            if (layers[i] == null) {
156
            IMarkerSymbol layer = layers[i];
157
            if (layer == null) {
154 158
                continue;
155 159
            }
156
            layers[i].draw(g, affineTransform, geom, feature, cancel);
160
            layer.setCartographicContext(this.getCartographicContext());
161
            if(layer instanceof IMarkerSymbol_v2){
162
                ((IMarkerSymbol_v2)layer).draw(g, affineTransform, geom, f, cancel, r);
163
            } else {
164
                layer.draw(g, affineTransform, geom, f, cancel);
165
            }
157 166
        }
158 167
        g.rotate(-rotation, p.getX(), p.getY());
159 168
    }
160 169

  
161
    @Override
162
    public void drawInsideRectangle(Graphics2D g, AffineTransform scaleInstance, Rectangle r, PrintAttributes properties) throws SymbolDrawingException {
163
        g.rotate(rotation, r.getCenterX(), r.getCenterY());
164
        for (int i = 0; layers != null && i < layers.length; i++) {
165
            if (layers[i] == null) {
166
                continue;
167
            }
168
            layers[i].drawInsideRectangle(g, scaleInstance, r, properties);
169
        }
170
        g.rotate(-rotation, r.getCenterX(), r.getCenterY());
171
    }
170
//    @Override
171
//    public int getOnePointRgb() {
172
//        // will paint only the last layer pixel
173
//        return layers[layers.length - 1].getOnePointRgb();
174
//    }
175
//
176
//    @Override
177
//    public void getPixExtentPlus(Geometry geom, float[] distances,
178
//            ViewPort viewPort, int dpi) {
179
//        float[] myDistances = new float[]{0, 0};
180
//        distances[0] = 0;
181
//        distances[1] = 0;
182
//        for (int i = 0; layers != null && i < layers.length; i++) {
183
//            if (layers[i] == null) {
184
//                continue;
185
//            }
186
//            layers[i].getPixExtentPlus(geom, myDistances, viewPort, dpi);
187
//            distances[0] = Math.max(myDistances[0], distances[0]);
188
//            distances[1] = Math.max(myDistances[1], distances[1]);
189
//        }
190
//    }
172 191

  
173 192
    @Override
174
    public int getOnePointRgb() {
175
        // will paint only the last layer pixel
176
        return layers[layers.length - 1].getOnePointRgb();
177
    }
178

  
179
    @Override
180
    public void getPixExtentPlus(Geometry geom, float[] distances,
181
            ViewPort viewPort, int dpi) {
182
        float[] myDistances = new float[]{0, 0};
183
        distances[0] = 0;
184
        distances[1] = 0;
185
        for (int i = 0; layers != null && i < layers.length; i++) {
186
            if (layers[i] == null) {
187
                continue;
188
            }
189
            layers[i].getPixExtentPlus(geom, myDistances, viewPort, dpi);
190
            distances[0] = Math.max(myDistances[0], distances[0]);
191
            distances[1] = Math.max(myDistances[1], distances[1]);
192
        }
193
    }
194

  
195
    @Override
196 193
    public ISymbol getSymbolForSelection() {
197 194
        if (selectionSymbol == null) {
198 195
            selectionSymbol = new MultiLayerMarkerSymbol();
......
205 202
                selectionSymbol.setLayer(i, selectionSymbol.getLayer(i).getSymbolForSelection());
206 203
            }
207 204
        }
205
        if (selectionSymbol instanceof CartographicSupport) {
206
            ((CartographicSupport) selectionSymbol).setUnit(this.getUnit());
207
        }
208 208
        return selectionSymbol;
209 209

  
210 210
    }
......
243 243

  
244 244
    @Override
245 245
    public ISymbol getLayer(int layerIndex) {
246
//		try{
247 246
        return layers[layerIndex];
248
//		} catch (Exception e) {
249
//			return null;
250
//		}
251 247
    }
252 248

  
253 249
    @Override
......
266 262
            /*|| newLayer instanceof ILabelStyle)*/ return; // null or symbols that are styles are not allowed
267 263
        }
268 264

  
265
        if(!(newLayer instanceof IMarkerSymbol_v2)){
266
            LOGGER.info("Symbol "+newLayer.getClass().getName()+" does not implement IMarkerSymbol_v2");
267
        }
269 268
        IMarkerSymbol newMarker = (IMarkerSymbol) newLayer;
270 269
        if (getLayerCount() == 0) {
271 270
            // apply the new layer properties to this multilayer
......
290 289
            throw new IndexOutOfBoundsException(layerIndex + " < 0 or " + layerIndex + " > " + layers.length);
291 290
        }
292 291
        List<IMarkerSymbol> newLayers = new ArrayList<>();
293
        for (int i = 0; i < layers.length; i++) {
294
            newLayers.add(layers[i]);
295
        }
292
        newLayers.addAll(Arrays.asList(layers));
296 293
        try {
297 294
            newLayers.add(layerIndex, (IMarkerSymbol) newLayer);
298
            layers = (IMarkerSymbol[]) newLayers.toArray(new IMarkerSymbol[0]);
295
            layers = (IMarkerSymbol[]) newLayers.toArray(new IMarkerSymbol[newLayers.size()]);
299 296
        } catch (ArrayStoreException asEx) {
300 297
            throw new ClassCastException(newLayer.getClass().getName() + " is not an IMarkerSymbol");
301 298
        }

Also available in: Unified diff