Statistics
| Revision:

svn-gvsig-desktop / tags / v1_11_0_Build_1306 / extensions / extArcims / src / es / prodevelop / cit / gvsig / arcims / fmap / layers / FRasterLyrArcIMS.java @ 35731

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.getRender().setBufferFactory(layerRaster.getBufferFactory());
600

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

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

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

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

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

    
653
        }
654

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

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

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

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

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

    
707
        return null;
708
    }
709

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

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

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

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

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

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

    
758
        return null;
759
    }
760

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
839
        return xml;
840
    }
841

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

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

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

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

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

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

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

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

    
887
        String claseStr = StatusLayerRaster.defaultClass;
888

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

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

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

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

    
930
        firstLoad = true;
931
    }
932

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

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

    
942
        return v;
943
    }
944

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

    
952
        LayerScaleData theLayerScaleData = null;
953

    
954
        si = arcimsStatus.getServiceInfo();
955

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

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

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

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

    
975
        return theLayerScaleData;
976
    }
977

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

    
983
        actionListeners.add(al);
984
    }
985

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1184
        return resp;
1185
    }
1186

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

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

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

    
1200
        return false;
1201
    }
1202

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

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

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

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

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

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

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

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

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

    
1250
            return null;
1251
        }
1252
    }
1253

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

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

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

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

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

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

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

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

    
1303

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

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

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

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

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

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

    
1386

    
1387

    
1388
}