Statistics
| Revision:

root / trunk / extensions / extArcims / src / es / prodevelop / cit / gvsig / arcims / fmap / layers / FRasterLyrArcIMS.java @ 38059

History | View | Annotate | Download (43.7 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *   Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *   +34 963862235
28
 *   gvsig@gva.es
29
 *   www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   Prodevelop Integraci?n de Tecnolog?as SL
34
 *   Conde Salvatierra de ?lava , 34-10
35
 *   46004 Valencia
36
 *   Spain
37
 *
38
 *   +34 963 510 612
39
 *   +34 963 510 968
40
 *   gis@prodevelop.es
41
 *   http://www.prodevelop.es
42
 */
43
package es.prodevelop.cit.gvsig.arcims.fmap.layers;
44

    
45
import java.awt.Dimension;
46
import java.awt.Graphics2D;
47
import java.awt.Point;
48
import java.awt.Rectangle;
49
import java.awt.event.ActionEvent;
50
import java.awt.event.ActionListener;
51
import java.awt.geom.AffineTransform;
52
import java.awt.geom.NoninvertibleTransformException;
53
import java.awt.geom.Point2D;
54
import java.awt.geom.Rectangle2D;
55
import java.awt.image.BufferedImage;
56
import java.awt.image.DataBuffer;
57
import java.io.File;
58
import java.io.IOException;
59
import java.lang.reflect.Constructor;
60
import java.lang.reflect.InvocationTargetException;
61
import java.net.MalformedURLException;
62
import java.net.URL;
63
import java.util.ArrayList;
64
import java.util.HashMap;
65
import java.util.Map;
66
import java.util.Vector;
67

    
68
import javax.print.attribute.PrintRequestAttributeSet;
69
import javax.swing.ImageIcon;
70

    
71
import org.apache.log4j.Logger;
72
import org.cresques.cts.IProjection;
73
import org.cresques.geo.ViewPortData;
74
import org.cresques.px.Extent;
75
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
76
import org.gvsig.fmap.raster.layers.IRasterLayerActions;
77
import org.gvsig.fmap.raster.layers.IStatusRaster;
78
import org.gvsig.fmap.raster.layers.StatusLayerRaster;
79
import org.gvsig.raster.dataset.CompositeDataset;
80
import org.gvsig.raster.dataset.IBuffer;
81
import org.gvsig.raster.dataset.MosaicNotValidException;
82
import org.gvsig.raster.dataset.MultiRasterDataset;
83
import org.gvsig.raster.grid.Grid;
84
import org.gvsig.raster.grid.GridPalette;
85
import org.gvsig.raster.grid.GridTransparency;
86
import org.gvsig.raster.grid.filter.FilterTypeException;
87
import org.gvsig.raster.grid.filter.RasterFilterList;
88
import org.gvsig.raster.grid.filter.RasterFilterListManager;
89
import org.gvsig.raster.grid.filter.bands.ColorTableFilter;
90
import org.gvsig.raster.grid.filter.bands.ColorTableListManager;
91
import org.gvsig.remoteClient.arcims.ArcImsClientP;
92
import org.gvsig.remoteClient.arcims.ArcImsProtImageHandler;
93
import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler;
94
import org.gvsig.remoteClient.arcims.ArcImsStatus;
95
import org.gvsig.remoteClient.arcims.exceptions.ArcImsException;
96
import org.gvsig.remoteClient.arcims.utils.MyCancellable;
97
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags;
98
import org.gvsig.remoteClient.arcims.utils.ServiceInformation;
99
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer;
100
import org.gvsig.remoteClient.utils.Utilities;
101

    
102
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
103
import com.hardcode.gdbms.engine.data.driver.DriverException;
104
import com.iver.andami.PluginServices;
105
import com.iver.cit.gvsig.exceptions.layers.LoadLayerException;
106
import com.iver.cit.gvsig.fmap.ViewPort;
107
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
108
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
109
import com.iver.cit.gvsig.fmap.layers.FLayer;
110
import com.iver.cit.gvsig.fmap.layers.Tiling;
111
import com.iver.cit.gvsig.fmap.layers.XMLException;
112
import com.iver.cit.gvsig.fmap.layers.layerOperations.StringXMLItem;
113
import com.iver.cit.gvsig.fmap.layers.layerOperations.XMLItem;
114
import com.iver.utiles.StringUtilities;
115
import com.iver.utiles.XMLEntity;
116
import com.iver.utiles.connections.ConnectionException;
117
import com.iver.utiles.swing.threads.Cancellable;
118
import com.iver.utiles.swing.threads.DefaultCancellableMonitorable;
119

    
120
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsDriver;
121
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapRasterArcImsDriver;
122
import es.prodevelop.cit.gvsig.arcims.fmap.listeners.FRasterLyrArcIMSListener;
123

    
124

    
125
/**
126
 * This class implements an ArcIMS raster layer.
127
 *
128
 * @author jldominguez
129
 */
130
public class FRasterLyrArcIMS extends FLyrRasterSE {
131

    
132
    private static Logger logger = Logger.getLogger(FRasterLyrArcIMS.class.getName());
133
    public static final String SCALE_CHANGED_COMMAND = "SCALE_HAS_CHANGED";
134
    private MyCancellable myCanc;
135
    private URL host;
136
    private String service;
137
    private String serviceType;
138
    private Rectangle2D fullExtent;
139
    private boolean firstLoad = false;
140
    private ArcImsStatus arcimsStatus = new ArcImsStatus();
141
    private String SRS;
142
    private String layerQuery;
143
    private ArcImsDriver driver;
144
    private VisualStatusArcIms visualStatus = new VisualStatusArcIms();
145
    private int transparency = -1;
146
    private boolean arcImsTransparency = true;
147
    private String format;
148

    
149
        private RasterFilterList            filterList = null;
150
        private GridTransparency                        gridTransparency = null;
151
        private int[]                       renderBands = null;
152
        private FLyrRasterSE                                layerRaster = null;
153
        private ArrayList                   filterArguments = null;
154

    
155
    private int posX = 0;
156
    private int posY = 0;
157
    private double posXWC = 0;
158
    private double posYWC = 0;
159
    private ArrayList actionListeners = new ArrayList();
160
    private int maxTileWidth = 1023;
161
    private int maxTileHeight = 1023;
162

    
163
    private Grid grid = null;
164

    
165
    private boolean nameQueryChange = false;
166
    private ArrayList listeners = new ArrayList();
167
    private boolean tiled = false;
168
    private int[] tileSize = new int[2];
169
    private ActionEvent scaleChangedEvent = new ActionEvent(this,
170
            ActionEvent.ACTION_PERFORMED, SCALE_CHANGED_COMMAND);
171

    
172
    public FRasterLyrArcIMS() {
173
        myCanc = new MyCancellable(new DefaultCancellableMonitorable());
174
    }
175

    
176
    /**
177
     * The extCatalogYNomenclator needs this creator.
178
     *
179
     * @param p a Map object with the following keys:
180
     *
181
     * (key, object type returned)
182
     * ---------------------------
183
     * "host", String (with or without the servlet path, example:
184
     *                                         "http://www.geographynetwork.com")
185
     * "service_name", String (remote service name)
186
     * "srs", String (coordinate system)
187
     * "layer_name", String (local layer's name)
188
     *
189
     * @return a FRasterLyrArcIMS layer
190
     */
191
    public FRasterLyrArcIMS(Map m) throws ConnectionException {
192
        myCanc = new MyCancellable(new DefaultCancellableMonitorable());
193

    
194
        String _host = "";
195

    
196
        try {
197
            _host = (String) m.get("host");
198

    
199
            String _service_name = (String) m.get("service_name");
200
            String _srs = (String) m.get("srs");
201
            String _image_format = "JPG";
202
            String _layer_name = (String) m.get("layer_name");
203

    
204
            // in case layer_name is missing or equals the empty string:
205
            if ((_layer_name == null) || (_layer_name.length() == 0)) {
206
                _layer_name = _service_name;
207
            }
208

    
209
            // ----------------------------
210
            URL _true_host = ArcImsProtocolHandler.getUrlWithServlet(new URL(
211
                        _host));
212
            IProjection _true_srs = CRSFactory.getCRS(_srs);
213

    
214
            FMapRasterArcImsDriver _drv = new FMapRasterArcImsDriver(_true_host.toString(),
215
                    _service_name, ServiceInfoTags.vIMAGESERVICE);
216

    
217
            if (!_drv.connect(myCanc)) {
218
                throw new ConnectionException("Unable to connect to host ",
219
                    new Exception(_host));
220
            }
221

    
222
            setDriver(_drv);
223
            setHost(_true_host);
224
            setService(_service_name);
225
            setServiceType(ServiceInfoTags.vIMAGESERVICE);
226
            setServiceInformationInStatus(_drv.getClient()
227
                                              .getServiceInformation());
228

    
229
            ServiceInformation _si = getArcimsStatus().getServiceInfo();
230

    
231
            if ((_si.getFeaturecoordsys() == null) ||
232
                    (_si.getFeaturecoordsys().equals(""))) {
233
                _si.setFeaturecoordsys(_true_srs.getAbrev()
234
                                                .substring(ServiceInfoTags.vINI_SRS.length())
235
                                                .trim());
236
                logger.warn("Server provides no SRS. ");
237
            }
238

    
239
            setFullExtent(((ArcImsProtImageHandler) _drv.getClient().getHandler()).getServiceExtent(
240
                    _true_srs, getArcimsStatus()));
241

    
242
            //  JPG
243
            setFormat(_image_format);
244
            setTransparency(0);
245

    
246
            // =================================== query
247
            int layercount = _si.getLayers().size();
248
            String _layer_query = "";
249

    
250
            for (int i = 0; i < layercount; i++) {
251
                if (isTrueString(
252
                            ((ServiceInformationLayer) _si.getLayer(i)).getVisible())) {
253
                    _layer_query = _layer_query + "," +
254
                        ((ServiceInformationLayer) _si.getLayer(i)).getId();
255
                }
256
            }
257

    
258
            if (_layer_query.length() == 0) {
259
                throw new Exception("No layers are visible by default ");
260
            }
261
            else {
262
                _layer_query = _layer_query.substring(1);
263
            }
264

    
265
            // ===================================
266
            setLayerQuery(_layer_query);
267
            setProjection(_true_srs);
268
            setName(_layer_name);
269
        } catch (Exception ex) {
270
                throw new ConnectionException("While creating FRasterLyrArcIMS from Map", ex);
271
        }
272
    }
273

    
274
    /**
275
     * Gets the driver object onto which <tt>getMap()</tt> and
276
     * <tt>getFeatureInfo()</tt> requests are passed. If the driver was not
277
     * created, this methdo creates it with the server's URL and the service
278
     * name.
279
     *
280
     * @return the driver that actually performs the requests.
281
     */
282
    public ArcImsDriver getDriver() {
283
        if (driver == null) {
284
            driver = new FMapRasterArcImsDriver(host.toString(), service,
285
                    this.serviceType);
286
        }
287

    
288
        return driver;
289
    }
290

    
291
    public void setDriver(FMapRasterArcImsDriver d) {
292
        driver = d;
293
    }
294

    
295
    /**
296
     * Gets the transformation matrix to be written in the georeference file.
297
     * The second and the third coefficients will always be zero (it doesn't
298
     * implement image rotation)
299
     *
300
     * @param bBox
301
     *            Image's size and position (user's coordinates)
302
     * @param sz
303
     *            Images' size in pixels
304
     * @return the worldfile, as a String
305
     * @throws IOException
306
     */
307
    public String getDataWorldFile(Rectangle2D bBox, Dimension sz)
308
        throws IOException {
309
        StringBuffer data = new StringBuffer();
310
        data.append(((bBox.getMaxX() - bBox.getMinX()) / (sz.getWidth() - 1)) +
311
            "\n");
312
        data.append("0.0\n");
313
        data.append("0.0\n");
314
        data.append("-" +
315
            ((bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1)) + "\n");
316

    
317
        // data.append((bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1) + "\n");
318
        data.append("" + bBox.getMinX() + "\n");
319

    
320
        // data.append("" + bBox.getMinY() + "\n");
321
        data.append("" + bBox.getMaxY() + "\n");
322

    
323
        return data.toString();
324
    }
325

    
326
    /**
327
     * This method must be invoqued with <b>true</b> if the layer must show its
328
     * transparency. The level of transparency is set by another method.
329
     *
330
     * @param t
331
     *            Whether or not the transparency must be shown.
332
     */
333
    public void setArcImsTransparency(boolean t) {
334
        this.arcImsTransparency = t;
335
    }
336

    
337
    /**
338
     * Drawing method invoqued from outside the plugin.
339
     *
340
     * @param g
341
     *            graphic object on which drawing is made.
342
     * @param vp
343
     *            the view
344
     * @param cancel
345
     *            allows drawing abortion
346
     * @throws DriverException
347
     */
348
    private void drawTile(Graphics2D g, ViewPort vp, Cancellable cancel, double scale)
349
        throws DriverException {
350
        // This is the extent that will be requested
351
        Rectangle2D bBox = vp.getAdjustedExtent(); // getFullExtent();
352
        Dimension sz = vp.getImageSize();
353

    
354
        try {
355
            arcimsStatus.setExtent(bBox);
356
            arcimsStatus.setFormat(getFormat());
357
            arcimsStatus.setHeight(vp.getImageHeight());
358
            arcimsStatus.setWidth(vp.getImageWidth());
359
            arcimsStatus.setLayerIds(Utilities.createVector(layerQuery, ","));
360
            arcimsStatus.setServer(host.toString());
361
            arcimsStatus.setService(service);
362
            arcimsStatus.setSrs(this.getProjection().getAbrev());
363
            arcimsStatus.setTransparency(this.arcImsTransparency);
364

    
365
            // We need to cast because driver returns an Object
366
            File f = (File) getDriver().getMap(arcimsStatus);
367

    
368
            int lastp = f.getPath().lastIndexOf(".");
369
            String noext = f.getPath().substring(0, lastp);
370

    
371
            String nameWorldFile = noext + getExtensionWordFile(getFormat());
372

    
373
            com.iver.andami.Utilities.createTemp(nameWorldFile,
374
                this.getDataWorldFile(bBox, sz));
375

    
376
            // ------------------------------ START
377
            ViewPortData vpData = new ViewPortData(vp.getProjection(),
378
                    new Extent(bBox), sz);
379
            vpData.setMat(vp.getAffineTransform());
380

    
381
            // ------------------------------ END
382
            rasterProcess(f, g, vp, scale, cancel);
383
        } catch (Exception e) {
384
            DriverException de = new DriverException("While drawing tile: " + e.getMessage());
385
            logger.error("While drawing tile: " + e.getMessage());
386
            throw de;
387
        }
388
    }
389

    
390
    /**
391
     * Drawing method invoqued from gvSIG to draw this layer. Uses a <tt>Tiling</tt>
392
     * object to prevent downloading images too large to be retrieved
393
     * (pixel count limit)
394
     *
395
     * @param image
396
     *            used to speed up drawing process
397
     * @param g
398
     *            graphic object on which drawing is make
399
     * @param viewPort
400
     *            the view's properties
401
     * @param cancel
402
     *            allows drawing abortion
403
     * @param scale the current scale
404
     *
405
     * @throws DriverException
406
     */
407
    public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
408
        Cancellable cancel, double scale) throws ReadDriverException {
409
        if (!isVisible()) {
410
            return;
411
        }
412
        
413
        if (!isWithinScale(scale)) {
414
            return;
415
        }
416

    
417
        visualStatus.width = viewPort.getImageWidth();
418
        visualStatus.height = viewPort.getImageHeight();
419
        visualStatus.minX = viewPort.getAdjustedExtent().getMinX();
420
        visualStatus.minY = viewPort.getAdjustedExtent().getMinY();
421
        visualStatus.maxX = viewPort.getAdjustedExtent().getMaxX();
422
        visualStatus.maxY = viewPort.getAdjustedExtent().getMaxY();
423

    
424
        setTileDimensions(viewPort);
425

    
426
        Point2D p = viewPort.getOffset();
427
        Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(),
428
                viewPort.getImageWidth() - 1, viewPort.getImageHeight() - 1);
429
        Tiling tiles = new Tiling(maxTileWidth, maxTileHeight, r);
430
        tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform()
431
                                                           .clone());
432

    
433
        tiled = false;
434

    
435

    
436
                try {
437
                        // enableAwake();
438
                        enableStopped();
439
                } catch (Exception e1) {
440
                        throw new ReadDriverException("Error changing awake state",e1);
441
                }
442

    
443

    
444
                if (tiles.getNumTiles() > 1) {
445
            tiled = true;
446
            tileSize[0] = tiles.getMaxTileWidth();
447
            tileSize[1] = tiles.getMaxTileHeight();
448

    
449
                        MultiRasterDataset[][] datasets = new MultiRasterDataset[tiles.getNumRows()][tiles.getNumCols()];
450
                        IBuffer[][] buf = new IBuffer[tiles.getNumRows()][tiles.getNumCols()];
451

    
452

    
453
            // more than one tile ----------------------
454
            for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
455
                // drawing part
456
                try {
457
                    ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
458
                    drawTile(g, vp, cancel, scale);
459

    
460
                                        if (layerRaster != null) {
461
                                                datasets[(int)(tileNr / tiles.getNumCols())][tileNr % tiles.getNumCols()] =
462
                                                        (MultiRasterDataset)layerRaster.getDataSource().newDataset();
463
                                                buf[(int)(tileNr / tiles.getNumCols())][tileNr % tiles.getNumCols()] =
464
                                                        layerRaster.getRender().getLastRenderBuffer();
465
                                        }
466
                } catch (NoninvertibleTransformException e) {
467
                    logger.error("Non invertible matrix! ", e);
468
                } catch (DriverException de) {
469
                    logger.error("While drawing tile: " + de.getMessage());
470
                    this.setAvailable(false);
471
                }
472
            }
473

    
474
                        try {
475
                                if(datasets != null && datasets[0][0] != null) {
476
                                        dataset = new CompositeDataset(datasets);
477
                                        initializeRasterLayer(datasets, buf);
478
                                }
479
                        } catch (MosaicNotValidException e) {
480
                                throw new ReadDriverException("No hay continuidad en el mosaico.", e);
481
                        } catch (LoadLayerException e) {
482
                                throw new ReadDriverException("Error inicializando la capa.", e);
483
                        } catch (InterruptedException e) {
484
                                throw new ReadDriverException("Error interrupcion.", e);
485
                        }
486

    
487
            // more than one tile ----------------------
488

    
489

    
490
        } else {
491

    
492
                // one tile --------------------------------
493
                try {
494
                    ViewPort vp = tiles.getTileViewPort(viewPort, 0);
495
                    drawTile(g, vp, cancel, scale);
496

    
497
                                dataset = layerRaster.getDataSource();
498
                                getRender().setLastRenderBuffer(layerRaster.getRender().getLastRenderBuffer());
499
                                initializeRasterLayer(null, new IBuffer[][]{{layerRaster.getRender().getLastRenderBuffer()}});
500

    
501
                } catch (NoninvertibleTransformException e) {
502
                    logger.error("Non invertible matrix! ");
503
                } catch (DriverException de) {
504
                    logger.error("While drawing tile: " + de.getMessage());
505
                    this.setAvailable(false);
506
                } catch (LoadLayerException e) {
507
                    logger.error("While drawing: " + e.getMessage());
508
                    this.setAvailable(false);
509
                        } catch (InterruptedException e) {
510
                            logger.error("While drawing: " + e.getMessage());
511
                                }
512

    
513
                // one tile --------------------------------
514

    
515

    
516
        }
517

    
518

    
519
        // the status needs to be reset because the drawTile
520
        // method had changed its extent and dimension:
521
        arcimsStatus.setExtent(viewPort.getAdjustedExtent());
522
        arcimsStatus.setHeight(viewPort.getImageHeight());
523
        arcimsStatus.setWidth(viewPort.getImageWidth());
524

    
525
        callActionListeners(scaleChangedEvent);
526

    
527
        if (nameQueryChange) {
528
            callNameOrQueryListeners();
529
            nameQueryChange = false;
530
        }
531
        
532
        disableStopped();
533
    }
534

    
535
    private void setTileDimensions(ViewPort vp) {
536
        maxTileHeight = vp.getImageHeight();
537

    
538
        try {
539
            maxTileWidth = Integer.parseInt(arcimsStatus.getServiceInfo()
540
                                                        .getImagelimit_pixelcount()) / maxTileHeight;
541
            maxTileWidth--;
542
        }
543
        catch (NumberFormatException nfe) {
544
            logger.error("getImagelimit_pixelcount() returned a non parseable string. maxTileWidth was set to 100.",
545
                nfe);
546
            maxTileWidth = 100;
547
        }
548

    
549
        logger.info("Tile size = [ " + maxTileWidth + " , " + maxTileHeight +
550
            " ]");
551
    }
552

    
553
    /**
554
     * Gets the georeference file extension depending on the image's format.
555
     *
556
     * @param f
557
     *            raster file format
558
     * @return georeference file extension (".wld", ".tfw", etc)
559
     */
560
    private String getExtensionWordFile(String f) {
561
        String extWorldFile = ".wld";
562

    
563
        if (f.equals("tif") || f.equals("tiff")) {
564
            extWorldFile = ".tfw";
565
        }
566

    
567
        if (f.equals("jpeg")) {
568
            extWorldFile = ".jpgw";
569
        }
570

    
571
        return extWorldFile;
572
    }
573

    
574
        /**
575
         * Loads and draws the raster using the library
576
         * @param filePath Ruta al fichero en disco
577
         * @param g Graphics2D
578
         * @param vp ViewPort
579
         * @param scale Escala para el draw
580
         * @param cancel Cancelaci?n para el draw
581
         * @throws ReadDriverException
582
         * @throws LoadLayerException
583
         */
584
        private void rasterProcess(
585
                        File file,
586
                        Graphics2D g,
587
                        ViewPort vp,
588
                        double scale,
589
                        Cancellable cancel) throws ReadDriverException, LoadLayerException, FilterTypeException {
590

    
591
                //Cerramos el dataset asociado a la capa si est? abierto.
592
                if(layerRaster != null) {
593
                        layerRaster.setRemoveRasterFlag(true);
594
                        layerRaster.getDataSource().close();
595
                }
596

    
597
                //Cargamos el dataset con el raster de disco.
598
                layerRaster = FLyrRasterSE.createLayer("", file.getAbsolutePath(), vp.getProjection());
599
//                layerRaster.init();
600
//                layerRaster.getRender().setBufferFactory(layerRaster.getBufferFactory());
601

    
602
                //Obtenemos la tabla de color del raster abierto ya que se le va a sustituir la lista
603
                //de filtros y el de tabla de color no queremos sustituirlo.
604
                RasterFilterList rasterFilterList = layerRaster.getRender().getFilterList();
605
                ColorTableFilter ct = (ColorTableFilter)rasterFilterList.getFilterByBaseClass(ColorTableFilter.class);
606
                Object param = null;
607
                if(ct != null)
608
                        param = ct.getParam("colorTable");
609

    
610
                //En caso de cargar un proyecto con XMLEntity se crean los filtros
611
                if(filterArguments != null) {
612
                        RasterFilterList fl = new RasterFilterList();
613
                        fl.addEnvParam("IStatistics", layerRaster.getDataSource().getStatistics());
614
                        fl.addEnvParam("MultiRasterDataset", layerRaster.getDataSource());
615
                        fl.setInitDataType(layerRaster.getDataType()[0]);
616
                        RasterFilterListManager filterListManager = new RasterFilterListManager(fl);
617
                        filterListManager.createFilterListFromStrings(filterArguments);
618
                        filterArguments = null;
619
                        filterList = fl;
620
                }
621

    
622
                //Como el raster se carga a cada zoom el render se crea nuevamente y la lista de
623
                //filtros siempre estar? vacia a cada visualizaci?n. Para evitarlo tenemos que
624
                //guardar la lista de filtro aplicada en la visualizaci?n anterior.
625
                if(this.filterList != null) {
626
                        //Si ten?a tabla de color le asignamos la original
627
                        if(param != null && param instanceof GridPalette) {
628
                                this.filterList.remove(ColorTableFilter.class);
629
                                RasterFilterListManager filterManager = new RasterFilterListManager(filterList);
630
                                ColorTableListManager ctm = new ColorTableListManager(filterManager);
631
                                ctm.addColorTableFilter((GridPalette)param);
632
                                filterList.move(ColorTableFilter.class, 0);
633
                                filterList.controlTypes();
634
                        }
635
                        layerRaster.getRender().setFilterList(filterList);
636
                }
637
                if(gridTransparency != null)
638
                        layerRaster.getRender().setLastTransparency(gridTransparency);
639
                if(this.renderBands != null)
640
                        layerRaster.getRender().setRenderBands(renderBands);
641

    
642
                //Dibujamos
643
                layerRaster.draw(null, g, vp, cancel, scale);
644

    
645
                //La primera vez asignamos la lista de filtros asociada al renderizador. Guardamos una referencia
646
                //en esta clase para que a cada zoom no se pierda.
647
                if (this.filterList == null)
648
                        filterList = layerRaster.getRender().getFilterList();
649
                if (this.gridTransparency == null)
650
                        gridTransparency = layerRaster.getRender().getLastTransparency();
651
                if (this.renderBands == null)
652
                        renderBands = layerRaster.getRender().getRenderBands();
653

    
654
        }
655

    
656
        /*
657
    public void repaintRaster(Graphics2D g, ViewPort vp, File file) {
658
            rasterProcess(file, g, vp, scale, cancel);
659
        rasterProcess(g, vpData, file);
660
    }
661
    */
662

    
663
    public String getFormat() {
664
        return format;
665
    }
666

    
667
    public void setFormat(String f) {
668
        format = f;
669
    }
670

    
671
    /**
672
     * Gets a series of attributes that describe the layer's raster: Filename,
673
     * Filesize, Height, Width and Bands.
674
     *
675
     * @return A list of 2-element arrays { "Attribute name" , Value }
676
     */
677
    public ArrayList getAttributes() {
678

    
679
//        if (rasterFile != null) {
680
//            ArrayList attr = new ArrayList();
681
//            Object[][] a = {
682
//                    {
683
//                        "Filename",
684
//                        rasterFile.getName()
685
//                                  .substring(rasterFile.getName()
686
//                                                       .lastIndexOf("/") + 1,
687
//                            rasterFile.getName().length())
688
//                    },
689
//                    { "Filesize", new Long(rasterFile.getFileSize()) },
690
//                    {
691
//                        "Width",
692
//                        new Integer((new Double(this.getWidth())).intValue())
693
//                    },
694
//                    {
695
//                        "Height",
696
//                        new Integer((new Double(this.getHeight())).intValue())
697
//                    },
698
//                    { "Bands", new Integer(rasterFile.getBandCount()) }
699
//                };
700
//
701
//            for (int i = 0; i < a.length; i++) {
702
//                attr.add(a[i]);
703
//            }
704
//
705
//            return attr;
706
//        }
707

    
708
        return null;
709
    }
710

    
711
    /**
712
     *
713
    /**
714
     * Invoqued from gvSIG to draw this layer on a printable map. Uses a
715
     * <tt>Tiling</tt> object to prevent downloading images too large to be
716
     * retrieved (pixel count limit).
717
     *
718
     * @param g
719
     *            graphic object on which drawing is make
720
     * @param viewPort
721
     *            the view's properties
722
     * @param cancel
723
     *            allows drawing abortion
724
     * @param scale the current scale
725
     *
726
     * @throws DriverException
727
     */
728
    public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
729
        double scale, PrintRequestAttributeSet properties)
730
        throws ReadDriverException {
731
        draw(null, g, viewPort, cancel, scale);
732
    }
733

    
734
    public HashMap getProperties() {
735
        HashMap info = new HashMap();
736
        String[] layerNames = getLayerQuery().split(",");
737
        Vector layers = new Vector(layerNames.length);
738

    
739
        try {
740
            if (((FMapRasterArcImsDriver) getDriver()).connect(myCanc)) {
741
                info.put("layerName", this.getName());
742
                info.put("serverUrl", this.getHost());
743
                info.put("serviceName", this.getService());
744
                info.put("serviceType", this.getServiceType());
745
                info.put("format", this.format);
746

    
747
                for (int i = 0; i < layerNames.length; i++)
748
                    layers.add(layerNames[i]);
749

    
750
                info.put("layerIds", layers);
751

    
752
                return info;
753
            }
754
        }
755
        catch (Exception e) {
756
            logger.error("Error while reading FRasterLyrArcIMS properties. ", e);
757
        }
758

    
759
        return null;
760
    }
761

    
762
    public double getHeight() {
763
        return visualStatus.height;
764
    }
765

    
766
    public double getMaxX() {
767
        return visualStatus.maxX;
768
    }
769

    
770
    public double getMaxY() {
771
        return visualStatus.maxY;
772
    }
773

    
774
    public double getMinX() {
775
        return visualStatus.minX;
776
    }
777

    
778
    public double getMinY() {
779
        return visualStatus.minY;
780
    }
781

    
782
    public int[] getPixel(double wcx, double wcy) {
783
        return null;
784
    }
785

    
786
    public double getWidth() {
787
        return visualStatus.width;
788
    }
789

    
790
    public void setPos(int x, int y) {
791
        this.posX = x;
792
        this.posY = y;
793
    }
794

    
795
    public void setPosWC(double x, double y) {
796
        this.posXWC = x;
797
        this.posYWC = y;
798
    }
799

    
800
    /**
801
     *
802
     * @return XMLEntity.
803
     * @throws XMLException
804
     */
805
    public XMLEntity getXMLEntity() throws XMLException {
806
        XMLEntity xml = super.getXMLEntity();
807

    
808
        xml.putProperty("fullExtent", StringUtilities.rect2String(fullExtent));
809
        xml.putProperty("host", host.toExternalForm());
810
        xml.putProperty("serviceName", service);
811
        xml.putProperty("serviceType", serviceType);
812
        xml.putProperty("layerQuery", layerQuery);
813
        xml.putProperty("format", format);
814

    
815
        if (status != null) {
816
            status.getXMLEntity(xml, true, this);
817
        }
818
        else {
819
            status = new StatusLayerRaster();
820
            status.getXMLEntity(xml, true, this);
821
        }
822

    
823
        xml.putProperty("arcims_transparency", arcImsTransparency);
824

    
825
        
826
        int cnt = 0;
827
        boolean ex = true;
828
        String kn = "raster.file";
829
        while (ex) {
830
                kn = "raster.file" + cnt;
831
                try {
832
                        xml.getStringArrayProperty(kn);
833
                        xml.remove(kn);
834
                } catch (Exception exc) {
835
                        ex = false;
836
                }
837
                cnt++;
838
        }
839

    
840
        return xml;
841
    }
842

    
843
    /**
844
     *
845
     * @param xml
846
     *            XMLEntity
847
     *
848
     * @throws XMLException
849
     * @throws DriverException
850
     * @throws DriverIOException
851
     */
852
    public void setXMLEntity(XMLEntity xml) throws XMLException {
853
        
854
            super.setXMLEntity(xml);
855

    
856
        fullExtent = StringUtilities.string2Rect(xml.getStringProperty(
857
                    "fullExtent"));
858

    
859
        try {
860
            host = new URL(xml.getStringProperty("host"));
861
        }
862
        catch (MalformedURLException e) {
863
            logger.error("Whle reading XML file ", e);
864
            throw new XMLException(e);
865
        }
866

    
867
        this.layerQuery = xml.getStringProperty("layerQuery");
868
        this.service = xml.getStringProperty("serviceName");
869
        this.serviceType = xml.getStringProperty("serviceType");
870
        this.format = xml.getStringProperty("format");
871

    
872
        FMapRasterArcImsDriver drv = new FMapRasterArcImsDriver(host.toString(),
873
                service, serviceType);
874

    
875
        if (!drv.connect(myCanc)) {
876
            logger.error("Error while loading service information. ");
877
        }
878

    
879
        ArcImsClientP cli = (ArcImsClientP) drv.getClient();
880
        ServiceInformation si = cli.getServiceInformation();
881
        this.arcimsStatus.setServiceInformation(si);
882

    
883
        if (xml.contains("arcims_transparency")) {
884
            this.arcImsTransparency = xml.getBooleanProperty(
885
                    "arcims_transparency");
886
        }
887

    
888
        String claseStr = StatusLayerRaster.defaultClass;
889

    
890
        if (xml.contains("raster.class")) {
891
            claseStr = xml.getStringProperty("raster.class");
892
        }
893

    
894
        if (status != null) {
895
            status.setXMLEntity(xml, this);
896
        }
897
        else {
898
            // When we load a project
899
            if ((claseStr != null) && !claseStr.equals("")) {
900
                try {
901
                    Class clase = Class.forName(claseStr);
902
                    Constructor constr = clase.getConstructor(null);
903
                    status = (IStatusRaster) constr.newInstance(null);
904

    
905
                    if (status != null) {
906
                        status.setXMLEntity(xml, this);
907
                                                filterArguments = status.getFilterArguments();
908
                                                gridTransparency = status.getTransparency();
909
                                                renderBands = status.getRenderBands();
910

    
911
                    }
912
                }
913
                catch (ClassNotFoundException exc) {
914
                    logger.error("Whle reading XML file ", exc);
915
                }
916
                catch (InstantiationException exc) {
917
                    logger.error("Whle reading XML file ", exc);
918
                }
919
                catch (IllegalAccessException exc) {
920
                    logger.error("Whle reading XML file ", exc);
921
                }
922
                catch (NoSuchMethodException exc) {
923
                    logger.error("Whle reading XML file ", exc);
924
                }
925
                catch (InvocationTargetException exc) {
926
                    logger.error("Whle reading XML file ", exc);
927
                }
928
            }
929
        }
930

    
931
        firstLoad = true;
932
    }
933

    
934
    public Vector getLayerScaleInfoVector() {
935
        Vector v = new Vector();
936
        String id;
937

    
938
        for (int i = 0; i < arcimsStatus.getLayerIds().size(); i++) {
939
            id = (String) arcimsStatus.getLayerIds().get(i);
940
            v.add(getScaleInfo(id));
941
        }
942

    
943
        return v;
944
    }
945

    
946
    public LayerScaleData getScaleInfo(String theId) {
947
        ServiceInformation si;
948
        ServiceInformationLayer sil;
949
        int noflayers;
950
        long true_max_scale;
951
        long true_min_scale;
952

    
953
        LayerScaleData theLayerScaleData = null;
954

    
955
        si = arcimsStatus.getServiceInfo();
956

    
957
        int _dpi = si.getScreen_dpi();
958
        String mapUnits = si.getMapunits();
959

    
960
        noflayers = si.getLayers().size();
961

    
962
        for (int i = 0; i < noflayers; i++) {
963
            sil = (ServiceInformationLayer) si.getLayer(i);
964

    
965
            if ((sil.getId().compareTo(theId)) == 0) {
966
                true_max_scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(sil.getMaxscale(),
967
                        mapUnits, _dpi);
968
                true_min_scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(sil.getMinscale(),
969
                        mapUnits, _dpi);
970
                theLayerScaleData = new LayerScaleData(sil.getName(),
971
                        sil.getId(), true_min_scale, true_max_scale,
972
                        sil.getType());
973
            }
974
        }
975

    
976
        return theLayerScaleData;
977
    }
978

    
979
    public void addActionlistener(ActionListener al) {
980
        if (actionListeners.contains(al)) {
981
            return;
982
        }
983

    
984
        actionListeners.add(al);
985
    }
986

    
987
    public void removeActionlistener(ActionListener al) {
988
        actionListeners.remove(al);
989
    }
990

    
991
    private void callActionListeners(ActionEvent ae) {
992
        ActionListener al;
993

    
994
        for (int i = 0; i < actionListeners.size(); i++) {
995
            al = (ActionListener) actionListeners.get(i);
996
            al.actionPerformed(ae);
997
        }
998
    }
999

    
1000
    public long getScale() {
1001
        return getMapContext().getScaleView();
1002
    }
1003

    
1004
    public int getMaxTileHeight() {
1005
        return maxTileHeight;
1006
    }
1007

    
1008
    public void setMaxTileHeight(int maxTileHeight) {
1009
        this.maxTileHeight = maxTileHeight;
1010
    }
1011

    
1012
    public int getMaxTileWidth() {
1013
        return maxTileWidth;
1014
    }
1015

    
1016
    public void setMaxTileWidth(int maxTileWidth) {
1017
        this.maxTileWidth = maxTileWidth;
1018
    }
1019

    
1020
    public void setServiceInformationInStatus(ServiceInformation si) {
1021
        this.arcimsStatus.setServiceInformation(si);
1022
    }
1023

    
1024
    /**
1025
     * This is the <tt>getDriver</tt> method. The <tt>getDriver</tt>
1026
     * method will be implemented by sub-classes.
1027
     *
1028
     * @param d the new driver.
1029
     */
1030
    public void setDriver(ArcImsDriver d) {
1031
        driver = d;
1032
    }
1033

    
1034
    public ArcImsStatus getArcimsStatus() {
1035
        return arcimsStatus;
1036
    }
1037

    
1038
    public void setArcimsStatus(ArcImsStatus as) {
1039
        arcimsStatus = as;
1040
    }
1041

    
1042
    public boolean isFirstLoad() {
1043
        return firstLoad;
1044
    }
1045

    
1046
    public void setFirstLoad(boolean fl) {
1047
        firstLoad = fl;
1048
    }
1049

    
1050
    public URL getHost() {
1051
        return host;
1052
    }
1053

    
1054
    public void setHost(URL h) {
1055
        host = h;
1056
    }
1057

    
1058
    public String getLayerQuery() {
1059
        return layerQuery;
1060
    }
1061

    
1062
    public void setLayerQuery(String lQuery) {
1063
        this.layerQuery = lQuery;
1064

    
1065
        if (layerQuery.substring(0, 1).compareTo(",") == 0) {
1066
            layerQuery = layerQuery.substring(1);
1067
        }
1068
    }
1069

    
1070
    public String getService() {
1071
        return service;
1072
    }
1073

    
1074
    public void setService(String s) {
1075
        service = s;
1076
    }
1077

    
1078
    public String getServiceType() {
1079
        return serviceType;
1080
    }
1081

    
1082
    public void setServiceType(String st) {
1083
        serviceType = st;
1084
    }
1085

    
1086
    public String getSRS() {
1087
        return SRS;
1088
    }
1089

    
1090
    public void setSRS(String srs) {
1091
        SRS = srs;
1092
    }
1093

    
1094
    public void setFullExtent(Rectangle2D fe) {
1095
        fullExtent = fe;
1096
    }
1097

    
1098
    public Rectangle2D getFullExtent() {
1099
        return fullExtent;
1100
    }
1101

    
1102
    public boolean getArcImsTransparency() {
1103
        return arcImsTransparency;
1104
    }
1105

    
1106
    public int getTransparency() {
1107
        return transparency;
1108
    }
1109

    
1110
    public void setTransparency(int transparency) {
1111
        this.transparency = transparency;
1112
    }
1113

    
1114
    public int getPosX() {
1115
        return posX;
1116
    }
1117

    
1118
    public void setPosX(int posX) {
1119
        this.posX = posX;
1120
    }
1121

    
1122
    public double getPosXWC() {
1123
        return posXWC;
1124
    }
1125

    
1126
    public void setPosXWC(double posXWC) {
1127
        this.posXWC = posXWC;
1128
    }
1129

    
1130
    public int getPosY() {
1131
        return posY;
1132
    }
1133

    
1134
    public void setPosY(int posY) {
1135
        this.posY = posY;
1136
    }
1137

    
1138
    public double getPosYWC() {
1139
        return posYWC;
1140
    }
1141

    
1142
    public void setPosYWC(double posYWC) {
1143
        this.posYWC = posYWC;
1144
    }
1145

    
1146
    public void setFormatInStatus(String imgFormat) {
1147
        arcimsStatus.setFormat(imgFormat);
1148
    }
1149

    
1150
    /**
1151
     * This method invoques the <tt>FMapRasterArcImsDriver</tt>'s
1152
     * <tt>getFeatureInfo</tt> method with the given coordinates as a
1153
     * parameter
1154
     *
1155
     * @param p
1156
     *            the corrdinates of the screen pixel to be queried
1157
     *
1158
     * @return the data retrieved for that pixel
1159
     * @throws DriverException
1160
     */
1161
    public XMLItem[] getInfo(Point p, double tolerance, Cancellable cancel)
1162
        throws ReadDriverException {
1163
        StringXMLItem[] resp = new StringXMLItem[1];
1164
        String respStr;
1165

    
1166
        if (((FMapRasterArcImsDriver) driver).isQueryable()) {
1167
            try {
1168
                respStr = ((FMapRasterArcImsDriver) driver).getFeatureInfo(arcimsStatus,
1169
                        (int) p.getX(), (int) p.getY(), Integer.MAX_VALUE);
1170
            }
1171
            catch (ArcImsException e) {
1172
                    ReadDriverException de = new ReadDriverException("While getting feature info. ", e);
1173
                logger.error("In query by point ", e);
1174
                throw de;
1175
            }
1176
        }
1177
        else {
1178
                ReadDriverException de = new ReadDriverException("Layer not queriable.", new Exception("Layer not queriable."));
1179
            throw de;
1180
        }
1181

    
1182
        System.err.println(resp); //TODO BORRAR ESTO
1183
        resp[0] = new StringXMLItem(respStr, this);
1184

    
1185
        return resp;
1186
    }
1187

    
1188
    public boolean isTiled() {
1189
        return tiled;
1190
    }
1191

    
1192
    public int[] getTileSize() {
1193
        return tileSize;
1194
    }
1195

    
1196
    private boolean isTrueString(String visible) {
1197
        if (visible.compareToIgnoreCase("true") == 0) {
1198
            return true;
1199
        }
1200

    
1201
        return false;
1202
    }
1203

    
1204
    public void callNameOrQueryListeners() {
1205
        for (int i = 0; i < listeners.size(); i++) {
1206
            ((FRasterLyrArcIMSListener) listeners.get(i)).thingsHaveChanged(getLayerQuery(),
1207
                getName());
1208
        }
1209
    }
1210

    
1211
    public void addNameOrQueryListener(FRasterLyrArcIMSListener l) {
1212
        if (!listeners.contains(l)) {
1213
            listeners.add(l);
1214
        }
1215
    }
1216

    
1217
    public void removeNameOrQueryListener(FRasterLyrArcIMSListener l) {
1218
        listeners.remove(l);
1219
    }
1220

    
1221
    public void setNameQueryChange(boolean c) {
1222
        nameQueryChange = c;
1223
    }
1224

    
1225
    public ImageIcon getTocImageIcon() {
1226
        ImageIcon resp = null;
1227

    
1228
        try {
1229
            resp = createImageIcon("images/esrilogo.png");
1230
        }
1231
        catch (Exception ex) {
1232
        }
1233

    
1234
        if (resp == null) {
1235
            return super.getTocImageIcon();
1236
        }
1237
        else {
1238
            return resp;
1239
        }
1240
    }
1241

    
1242
    protected ImageIcon createImageIcon(String path) {
1243
        java.net.URL imgURL = createExtensionUrl(path);
1244

    
1245
        if (imgURL != null) {
1246
            return new ImageIcon(imgURL);
1247
        }
1248
        else {
1249
            logger.error("File not found: " + path);
1250

    
1251
            return null;
1252
        }
1253
    }
1254

    
1255
    protected java.net.URL createExtensionUrl(String path) {
1256
        return PluginServices.getPluginServices(
1257
            "es.prodevelop.cit.gvsig.arcims").getClassLoader().getResource(path);
1258

    
1259
        // return getClass().getClassLoader().getResource(path);
1260
    }
1261

    
1262
    public Grid getGrid() {
1263
        return grid;
1264
    }
1265

    
1266
    private class VisualStatusArcIms {
1267
        /**
1268
         * Width and height of the image or the group of tiles if it have them. It's
1269
         * the same dimensions of the viewport
1270
         */
1271
        private int width = 0;
1272

    
1273
        /**
1274
         * Width and height of the image or the group of tiles if it have them. It's
1275
         * the same dimensions of the viewport
1276
         */
1277
        private int height = 0;
1278
        private double minX = 0D;
1279
        private double minY = 0D;
1280
        private double maxX = 0D;
1281
        private double maxY = 0D;
1282
        private int bandCount = 0;
1283
        private int dataType = DataBuffer.TYPE_UNDEFINED;
1284
    }
1285

    
1286
        public RasterFilterList getRenderFilterList(){
1287
                return (filterList != null) ? filterList : getRender().getFilterList();
1288
        }
1289

    
1290
        /*
1291
         * (non-Javadoc)
1292
         * @see org.gvsig.raster.hierarchy.IRasterRendering#setRenderFilterList(org.gvsig.raster.grid.filter.RasterFilterList)
1293
         */
1294
        public void setRenderFilterList(RasterFilterList filterList) {
1295
                this.filterList = filterList;
1296
                super.getRender().setFilterList(filterList);
1297
        }
1298

    
1299
        public void setRenderBands(int[] renderBands) {
1300
                this.renderBands = renderBands;
1301
                getRender().setRenderBands(renderBands);
1302
        }
1303

    
1304

    
1305
        /**
1306
         * Actions that are taken after setting the data sources for
1307
         * the raster layer
1308
         *
1309
         * @throws LoadLayerException
1310
         * @throws InterruptedException
1311
         */
1312
        private void initializeRasterLayer(MultiRasterDataset[][] datasets, IBuffer[][] buf) throws LoadLayerException, InterruptedException {
1313
                if(this.filterList != null)
1314
                        getRender().setFilterList(filterList);
1315
                if(this.gridTransparency != null)
1316
                        getRender().setLastTransparency(gridTransparency);
1317
                if(this.renderBands != null)
1318
                        getRender().setRenderBands(renderBands);
1319
                if(datasets != null) {
1320
                        String[][] names = new String[datasets.length][datasets[0].length];
1321
                        for (int i = 0; i < datasets.length; i++)
1322
                                for (int j = 0; j < datasets[i].length; j++)
1323
                                        names[i][j] = datasets[i][j].getDataset(0)[0].getFName();
1324
                        super.setLoadParams(names);
1325
                }
1326
                super.init();
1327
                if(buf != null) {
1328
                        int drawablesBandCount = layerRaster.getDataSource().getBands().getDrawableBandsCount();
1329
                        IBuffer buff = null;
1330
                        if(dataset instanceof CompositeDataset)
1331
                                buff = ((CompositeDataset)dataset).generateBuffer(buf, drawablesBandCount);
1332
                        else
1333
                                buff = buf[0][0];
1334
                        getRender().setLastRenderBuffer(buff);
1335
                }
1336
        }
1337

    
1338
        public GridTransparency getRenderTransparency() {
1339
                return (gridTransparency != null) ? gridTransparency : getRender().getLastTransparency();
1340
        }
1341

    
1342
        public boolean isActionEnabled(int action) {
1343
                switch (action) {
1344
                        case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
1345
                        case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
1346
                        case IRasterLayerActions.BANDS_FILE_LIST:
1347
                        case IRasterLayerActions.COLOR_TABLE:
1348
                        case IRasterLayerActions.GEOLOCATION:
1349
                        case IRasterLayerActions.PANSHARPENING:
1350
                                return false;
1351
                        case IRasterLayerActions.REMOTE_ACTIONS:
1352
                                return true;
1353
                }
1354

    
1355
                return super.isActionEnabled(action);
1356
        }
1357

    
1358
        public int[] getRenderBands() {
1359
                return (renderBands != null) ? renderBands : getRender().getRenderBands();
1360
        }
1361

    
1362
        /*
1363
         * (non-Javadoc)
1364
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#cloneLayer()
1365
         */
1366
        public FLayer cloneLayer() throws Exception {
1367
                FRasterLyrArcIMS layer = new FRasterLyrArcIMS();
1368
                layer.setHost(this.getHost());
1369
                layer.setName(this.getName());
1370
                layer.setSRS(this.getSRS());
1371
                layer.setFormat(this.getFormat());
1372
                layer.setFullExtent(this.fullExtent);
1373
                layer.setDriver(this.getDriver());
1374
        layer.setLayerQuery(this.layerQuery);
1375
        layer.setArcimsStatus(this.getArcimsStatus());
1376
        layer.visualStatus = this.visualStatus;
1377
        layer.setProjection(this.getProjection());
1378
        
1379
                ArrayList filters = getRender().getFilterList().getStatusCloned();
1380
                if(layer.getRender().getFilterList() == null)
1381
                        layer.getRender().setFilterList(new RasterFilterList());
1382
                layer.getRender().getFilterList().setStatus(filters);
1383
                
1384
                return layer;
1385
        }
1386

    
1387

    
1388

    
1389
}