Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.image.extension / src / main / java / org / gvsig / arcims / image / fmap / layers / FRasterLyrArcIMS.java @ 32321

History | View | Annotate | Download (37.8 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2010 Prodevelop S.L. main development
26
 * http://www.prodevelop.es
27
 */
28

    
29
package org.gvsig.arcims.image.fmap.layers;
30

    
31
import java.awt.Dimension;
32
import java.awt.Graphics2D;
33
import java.awt.Point;
34
import java.awt.Rectangle;
35
import java.awt.event.ActionEvent;
36
import java.awt.event.ActionListener;
37
import java.awt.geom.AffineTransform;
38
import java.awt.geom.NoninvertibleTransformException;
39
import java.awt.geom.Rectangle2D;
40
import java.awt.image.BufferedImage;
41
import java.awt.image.DataBuffer;
42
import java.io.File;
43
import java.io.IOException;
44
import java.net.URL;
45
import java.util.ArrayList;
46
import java.util.HashMap;
47
import java.util.Iterator;
48
import java.util.List;
49
import java.util.Map;
50
import java.util.Vector;
51

    
52
import javax.print.attribute.PrintRequestAttributeSet;
53
import javax.swing.ImageIcon;
54

    
55
import org.cresques.cts.IProjection;
56
import org.cresques.geo.ViewPortData;
57
import org.cresques.px.Extent;
58
import org.gvsig.andami.PluginServices;
59
import org.gvsig.arcims.image.fmap.drivers.ArcImsImageDriver;
60
import org.gvsig.arcims.image.fmap.listeners.FRasterLyrArcIMSListener;
61
import org.gvsig.fmap.crs.CRSFactory;
62
import org.gvsig.fmap.dal.exception.ReadException;
63
import org.gvsig.fmap.geom.primitive.impl.Envelope2D;
64
import org.gvsig.fmap.mapcontext.ViewPort;
65
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
66
import org.gvsig.fmap.mapcontext.layers.FLayer;
67
import org.gvsig.fmap.mapcontext.layers.Tiling;
68
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
69
import org.gvsig.fmap.raster.layers.IRasterLayerActions;
70
import org.gvsig.raster.dataset.CompositeDataset;
71
import org.gvsig.raster.dataset.IBuffer;
72
import org.gvsig.raster.dataset.MosaicNotValidException;
73
import org.gvsig.raster.dataset.MultiRasterDataset;
74
import org.gvsig.raster.grid.Grid;
75
import org.gvsig.raster.grid.GridPalette;
76
import org.gvsig.raster.grid.GridTransparency;
77
import org.gvsig.raster.grid.filter.FilterTypeException;
78
import org.gvsig.raster.grid.filter.RasterFilterList;
79
import org.gvsig.raster.grid.filter.RasterFilterListManager;
80
import org.gvsig.raster.grid.filter.bands.ColorTableFilter;
81
import org.gvsig.raster.grid.filter.bands.ColorTableListManager;
82
import org.gvsig.remoteclient.arcims.ArcImsProtImageHandler;
83
import org.gvsig.remoteclient.arcims.ArcImsProtocolHandler;
84
import org.gvsig.remoteclient.arcims.ArcImsStatus;
85
import org.gvsig.remoteclient.arcims.utils.MyCancellable;
86
import org.gvsig.remoteclient.arcims.utils.ServiceInfoTags;
87
import org.gvsig.remoteclient.arcims.utils.ServiceInformation;
88
import org.gvsig.remoteclient.arcims.utils.ServiceInformationLayer;
89
import org.gvsig.remoteclient.utils.Utilities;
90
import org.gvsig.tools.exception.DriverException;
91
import org.gvsig.tools.task.Cancellable;
92
import org.gvsig.utils.swing.threads.DefaultCancellableMonitorable;
93
import org.slf4j.Logger;
94
import org.slf4j.LoggerFactory;
95

    
96
/**
97
 * This class implements an ArcIMS raster layer.
98
 * 
99
 * @author jldominguez
100
 */
101
public class FRasterLyrArcIMS extends FLyrRasterSE {
102

    
103
        private static Logger logger = LoggerFactory
104
                        .getLogger(FRasterLyrArcIMS.class);
105
        public static final String SCALE_CHANGED_COMMAND = "SCALE_HAS_CHANGED";
106
        private MyCancellable myCanc;
107
        private URL host;
108
        private String service;
109
        private String serviceType;
110
        private Rectangle2D fullExtent;
111
        private boolean firstLoad = false;
112
        private ArcImsStatus arcimsStatus = new ArcImsStatus();
113
        private String SRS;
114
        private String layerQuery;
115
        private ArcImsImageDriver imageDriver;
116
        private VisualStatusArcIms visualStatus = new VisualStatusArcIms();
117
        private int transparency = -1;
118
        private boolean arcImsTransparency = true;
119
        private String format;
120

    
121
        private RasterFilterList filterList = null;
122
        private GridTransparency gridTransparency = null;
123
        private int[] renderBands = null;
124
        private FLyrRasterSE layerRaster = null;
125
        private ArrayList filterArguments = null;
126

    
127
        private int posX = 0;
128
        private int posY = 0;
129
        private double posXWC = 0;
130
        private double posYWC = 0;
131
        private List<ActionListener> actionListeners = new ArrayList<ActionListener>();
132
        private int maxTileWidth = 1023;
133
        private int maxTileHeight = 1023;
134

    
135
        private Grid grid = null;
136

    
137
        private boolean nameQueryChange = false;
138
        private List<FRasterLyrArcIMSListener> listeners = new ArrayList<FRasterLyrArcIMSListener>();
139
        private boolean tiled = false;
140
        private int[] tileSize = new int[2];
141
        private ActionEvent scaleChangedEvent = new ActionEvent(this,
142
                        ActionEvent.ACTION_PERFORMED, SCALE_CHANGED_COMMAND);
143

    
144
        public FRasterLyrArcIMS() {
145
                myCanc = new MyCancellable(new DefaultCancellableMonitorable());
146
        }
147

    
148
        /**
149
         * The extCatalogYNomenclator needs this creator.
150
         * 
151
         * @param p
152
         *            a Map object with the following keys:
153
         * 
154
         *            (key, object type returned) ---------------------------
155
         *            "host", String (with or without the servlet path, example:
156
         *            "http://www.geographynetwork.com") "service_name", String
157
         *            (remote service name) "srs", String (coordinate system)
158
         *            "layer_name", String (local layer's name)
159
         * 
160
         * @return a FRasterLyrArcIMS layer
161
         */
162
        public FRasterLyrArcIMS(Map m) throws Exception {
163
                myCanc = new MyCancellable(new DefaultCancellableMonitorable());
164

    
165
                String _host = "";
166

    
167
                try {
168
                        _host = (String) m.get("host");
169

    
170
                        String _service_name = (String) m.get("service_name");
171
                        String _srs = (String) m.get("srs");
172
                        String _image_format = "JPG";
173
                        String _layer_name = (String) m.get("layer_name");
174

    
175
                        // in case layer_name is missing or equals the empty string:
176
                        if ((_layer_name == null) || (_layer_name.length() == 0)) {
177
                                _layer_name = _service_name;
178
                        }
179

    
180
                        // ----------------------------
181
                        URL _true_host = ArcImsProtocolHandler.getUrlWithServlet(new URL(
182
                                        _host));
183
                        IProjection _true_srs = CRSFactory.getCRS(_srs);
184

    
185
                        ArcImsImageDriver _drv = new ArcImsImageDriver(_true_host
186
                                        .toString(), _service_name, ServiceInfoTags.vIMAGESERVICE);
187

    
188
                        if (!_drv.connect(myCanc)) {
189
                                throw new Exception("Unable to connect to host ",
190
                                                new Exception(_host));
191
                        }
192

    
193
                        setDriver(_drv);
194
                        setHost(_true_host);
195
                        setService(_service_name);
196
                        setServiceType(ServiceInfoTags.vIMAGESERVICE);
197
                        setServiceInformationInStatus(_drv.getClient()
198
                                        .getServiceInformation());
199

    
200
                        ServiceInformation _si = getArcimsStatus().getServiceInfo();
201

    
202
                        if ((_si.getFeaturecoordsys() == null)
203
                                        || (_si.getFeaturecoordsys().equals(""))) {
204
                                _si.setFeaturecoordsys(_true_srs.getAbrev().substring(
205
                                                ServiceInfoTags.vINI_SRS.length()).trim());
206
                                logger.warn("Server provides no SRS. ");
207
                        }
208

    
209
                        setFullExtent(((ArcImsProtImageHandler) _drv.getClient()
210
                                        .getHandler()).getServiceExtent(_true_srs,
211
                                        getArcimsStatus()));
212

    
213
                        // JPG
214
                        setFormat(_image_format);
215
                        setTransparency(0);
216

    
217
                        // =================================== query
218
                        int layercount = _si.getLayers().size();
219
                        String _layer_query = "";
220

    
221
                        for (int i = 0; i < layercount; i++) {
222
                                if (isTrueString(((ServiceInformationLayer) _si.getLayer(i))
223
                                                .getVisible())) {
224
                                        _layer_query = _layer_query
225
                                                        + ","
226
                                                        + ((ServiceInformationLayer) _si.getLayer(i))
227
                                                                        .getId();
228
                                }
229
                        }
230

    
231
                        if (_layer_query.length() == 0) {
232
                                throw new Exception("No layers are visible by default ");
233
                        } else {
234
                                _layer_query = _layer_query.substring(1);
235
                        }
236

    
237
                        // ===================================
238
                        setLayerQuery(_layer_query);
239
                        setProjection(_true_srs);
240
                        setName(_layer_name);
241
                } catch (Exception ex) {
242
                        throw new Exception("While creating FRasterLyrArcIMS from Map", ex);
243
                }
244
        }
245

    
246
        /**
247
         * Gets the driver object onto which <tt>getMap()</tt> and
248
         * <tt>getFeatureInfo()</tt> requests are passed. If the driver was not
249
         * created, this methdo creates it with the server's URL and the service
250
         * name.
251
         * 
252
         * @return the driver that actually performs the requests.
253
         */
254
        public ArcImsImageDriver getDriver() {
255
                if (imageDriver == null) {
256
                        imageDriver = new ArcImsImageDriver(host.toString(), service,
257
                                        this.serviceType);
258
                }
259

    
260
                return imageDriver;
261
        }
262

    
263
        /**
264
         * Gets the transformation matrix to be written in the georeference file.
265
         * The second and the third coefficients will always be zero (it doesn't
266
         * implement image rotation)
267
         * 
268
         * @param bBox
269
         *            Image's size and position (user's coordinates)
270
         * @param sz
271
         *            Images' size in pixels
272
         * @return the worldfile, as a String
273
         * @throws IOException
274
         */
275
        public String getDataWorldFile(Rectangle2D bBox, Dimension sz)
276
                        throws IOException {
277
                StringBuffer data = new StringBuffer();
278
                data.append(((bBox.getMaxX() - bBox.getMinX()) / (sz.getWidth() - 1))
279
                                + "\n");
280
                data.append("0.0\n");
281
                data.append("0.0\n");
282
                data.append("-"
283
                                + ((bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1))
284
                                + "\n");
285

    
286
                // data.append((bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1)
287
                // + "\n");
288
                data.append("" + bBox.getMinX() + "\n");
289

    
290
                // data.append("" + bBox.getMinY() + "\n");
291
                data.append("" + bBox.getMaxY() + "\n");
292

    
293
                return data.toString();
294
        }
295

    
296
        /**
297
         * This method must be invoqued with <b>true</b> if the layer must show its
298
         * transparency. The level of transparency is set by another method.
299
         * 
300
         * @param t
301
         *            Whether or not the transparency must be shown.
302
         */
303
        public void setArcImsTransparency(boolean t) {
304
                this.arcImsTransparency = t;
305
        }
306

    
307
        /**
308
         * Drawing method invoqued from outside the plugin.
309
         * 
310
         * @param g
311
         *            graphic object on which drawing is made.
312
         * @param vp
313
         *            the view
314
         * @param cancel
315
         *            allows drawing abortion
316
         * @throws Exception
317
         */
318
        private void drawTile(Graphics2D g, ViewPort vp, Cancellable cancel,
319
                        double scale) throws Exception {
320
                // This is the extent that will be requested
321
                Envelope2D env = (Envelope2D) vp.getAdjustedEnvelope();
322
                double xmin = env.getMinimum(0);
323
                double ymin = env.getMinimum(1);
324
                double w = env.getMaximum(0) - xmin;
325
                double h = env.getMaximum(1) - ymin;
326
                Rectangle2D bBox = new Rectangle2D.Double(xmin, ymin, w, h);
327
                Dimension sz = vp.getImageSize();
328

    
329
                try {
330
                        arcimsStatus.setEnvelope(bBox);
331
                        arcimsStatus.setFormat(getFormat());
332
                        arcimsStatus.setHeight(vp.getImageHeight());
333
                        arcimsStatus.setWidth(vp.getImageWidth());
334
                        arcimsStatus.setLayerIds(Utilities.createVector(layerQuery, ","));
335
                        arcimsStatus.setServer(host.toString());
336
                        arcimsStatus.setService(service);
337
                        arcimsStatus.setSrs(this.getProjection().getAbrev());
338
                        arcimsStatus.setTransparency(this.arcImsTransparency);
339

    
340
                        // We need to cast because driver returns an Object
341
                        File f = (File) getDriver().getMap(arcimsStatus);
342

    
343
                        int lastp = f.getPath().lastIndexOf(".");
344
                        String noext = f.getPath().substring(0, lastp);
345

    
346
                        String nameWorldFile = noext + getExtensionWordFile(getFormat());
347

    
348
                        org.gvsig.andami.Utilities.createTemp(nameWorldFile, this
349
                                        .getDataWorldFile(bBox, sz));
350

    
351
                        // ------------------------------ START
352
                        ViewPortData vpData = new ViewPortData(vp.getProjection(),
353
                                        new Extent(bBox), sz);
354
                        vpData.setMat(vp.getAffineTransform());
355

    
356
                        // ------------------------------ END
357
                        rasterProcess(f, g, vp, scale, cancel);
358
                } catch (Exception e) {
359
                        Exception de = new Exception("While drawing tile: "
360
                                        + e.getMessage());
361
                        logger.error("While drawing tile: " + e.getMessage());
362
                        throw de;
363
                }
364
        }
365

    
366
        /**
367
         * Drawing method invoqued from gvSIG to draw this layer. Uses a
368
         * <tt>Tiling</tt> object to prevent downloading images too large to be
369
         * retrieved (pixel count limit)
370
         * 
371
         * @param image
372
         *            used to speed up drawing process
373
         * @param g
374
         *            graphic object on which drawing is make
375
         * @param viewPort
376
         *            the view's properties
377
         * @param cancel
378
         *            allows drawing abortion
379
         * @param scale
380
         *            the current scale
381
         * 
382
         * @throws DriverException
383
         */
384
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
385
                        Cancellable cancel, double scale) throws ReadException {
386
                if (!isVisible()) {
387
                        return;
388
                }
389

    
390
                if (!isWithinScale(scale)) {
391
                        return;
392
                }
393

    
394
                visualStatus.width = viewPort.getImageWidth();
395
                visualStatus.height = viewPort.getImageHeight();
396
                visualStatus.minX = viewPort.getEnvelope().getLowerCorner().getX();
397
                visualStatus.minY = viewPort.getEnvelope().getLowerCorner().getY();
398
                visualStatus.maxX = viewPort.getEnvelope().getUpperCorner().getX();
399
                visualStatus.maxY = viewPort.getEnvelope().getUpperCorner().getY();
400

    
401
                setTileDimensions(viewPort);
402

    
403
                java.awt.geom.Point2D p = viewPort.getOffset();
404
                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort
405
                                .getImageWidth() - 1, viewPort.getImageHeight() - 1);
406
                Tiling tiles = new Tiling(maxTileWidth, maxTileHeight, r);
407
                tiles.setAffineTransform((AffineTransform) viewPort
408
                                .getAffineTransform().clone());
409

    
410
                tiled = false;
411

    
412
                try {
413
                        // enableAwake();
414
                        enableStopped();
415
                } catch (Exception e1) {
416
                        throw new ReadException("Error changing awake state", e1);
417
                }
418

    
419
                if (tiles.getNumTiles() > 1) {
420
                        tiled = true;
421
                        tileSize[0] = tiles.getMaxTileWidth();
422
                        tileSize[1] = tiles.getMaxTileHeight();
423

    
424
                        MultiRasterDataset[][] datasets = new MultiRasterDataset[tiles
425
                                        .getNumRows()][tiles.getNumCols()];
426
                        IBuffer[][] buf = new IBuffer[tiles.getNumRows()][tiles
427
                                        .getNumCols()];
428

    
429
                        // more than one tile ----------------------
430
                        for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
431
                                // drawing part
432
                                try {
433
                                        ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
434
                                        drawTile(g, vp, cancel, scale);
435

    
436
                                        if (layerRaster != null) {
437
                                                datasets[(int) (tileNr / tiles.getNumCols())][tileNr
438
                                                                % tiles.getNumCols()] = (MultiRasterDataset) layerRaster
439
                                                                .getDataSource().newDataset();
440
                                                buf[(int) (tileNr / tiles.getNumCols())][tileNr
441
                                                                % tiles.getNumCols()] = layerRaster.getRender()
442
                                                                .getLastRenderBuffer();
443
                                        }
444
                                } catch (NoninvertibleTransformException e) {
445
                                        logger.error("Non invertible matrix! ", e);
446
                                } catch (Exception de) {
447
                                        logger.error("While drawing tile: " + de.getMessage());
448
                                        this.setAvailable(false);
449
                                }
450
                        }
451

    
452
                        try {
453
                                if (datasets != null && datasets[0][0] != null) {
454
                                        dataset = new CompositeDataset(datasets);
455
                                        initializeRasterLayer(datasets, buf);
456
                                }
457
                        } catch (MosaicNotValidException e) {
458
                                throw new ReadException("No hay continuidad en el mosaico.", e);
459
                        } catch (LoadLayerException e) {
460
                                throw new ReadException("Error inicializando la capa.", e);
461
                        } catch (InterruptedException e) {
462
                                throw new ReadException("Error interrupcion.", e);
463
                        }
464

    
465
                        // more than one tile ----------------------
466

    
467
                } else {
468

    
469
                        // one tile --------------------------------
470
                        try {
471
                                ViewPort vp = tiles.getTileViewPort(viewPort, 0);
472
                                drawTile(g, vp, cancel, scale);
473

    
474
                                dataset = layerRaster.getDataSource();
475
                                getRender().setLastRenderBuffer(
476
                                                layerRaster.getRender().getLastRenderBuffer());
477
                                initializeRasterLayer(null, new IBuffer[][] { { layerRaster
478
                                                .getRender().getLastRenderBuffer() } });
479

    
480
                        } catch (NoninvertibleTransformException e) {
481
                                logger.error("Non invertible matrix! ");
482
                        } catch (Exception de) {
483
                                logger.error("While drawing tile: " + de.getMessage());
484
                                this.setAvailable(false);
485
                        }
486
                        // catch (LoadLayerException e) {
487
                        // logger.error("While drawing: " + e.getMessage());
488
                        // this.setAvailable(false);
489
                        // } catch (InterruptedException e) {
490
                        // logger.error("While drawing: " + e.getMessage());
491
                        // }
492

    
493
                        // one tile --------------------------------
494

    
495
                }
496

    
497
                // the status needs to be reset because the drawTile
498
                // method had changed its extent and dimension:
499
                Envelope2D enve = (Envelope2D) viewPort.getEnvelope();
500
                arcimsStatus.setEnvelope(enve);
501
                arcimsStatus.setHeight(viewPort.getImageHeight());
502
                arcimsStatus.setWidth(viewPort.getImageWidth());
503

    
504
                callActionListeners(scaleChangedEvent);
505

    
506
                if (nameQueryChange) {
507
                        callNameOrQueryListeners();
508
                        nameQueryChange = false;
509
                }
510

    
511
                disableStopped();
512
        }
513

    
514
        private void setTileDimensions(ViewPort vp) {
515
                maxTileHeight = vp.getImageHeight();
516

    
517
                try {
518
                        maxTileWidth = Integer.parseInt(arcimsStatus.getServiceInfo()
519
                                        .getImagelimit_pixelcount())
520
                                        / maxTileHeight;
521
                        maxTileWidth--;
522
                } catch (NumberFormatException nfe) {
523
                        logger
524
                                        .error(
525
                                                        "getImagelimit_pixelcount() returned a non parseable string. maxTileWidth was set to 100.",
526
                                                        nfe);
527
                        maxTileWidth = 100;
528
                }
529

    
530
                logger.info("Tile size = [ " + maxTileWidth + " , " + maxTileHeight
531
                                + " ]");
532
        }
533

    
534
        /**
535
         * Gets the georeference file extension depending on the image's format.
536
         * 
537
         * @param f
538
         *            raster file format
539
         * @return georeference file extension (".wld", ".tfw", etc)
540
         */
541
        private String getExtensionWordFile(String f) {
542
                String extWorldFile = ".wld";
543

    
544
                if (f.equals("tif") || f.equals("tiff")) {
545
                        extWorldFile = ".tfw";
546
                }
547

    
548
                if (f.equals("jpeg")) {
549
                        extWorldFile = ".jpgw";
550
                }
551

    
552
                return extWorldFile;
553
        }
554

    
555
        /**
556
         * Loads and draws the raster using the library
557
         * 
558
         * @param filePath
559
         *            Ruta al fichero en disco
560
         * @param g
561
         *            Graphics2D
562
         * @param vp
563
         *            ViewPort
564
         * @param scale
565
         *            Escala para el draw
566
         * @param cancel
567
         *            Cancelaci?n para el draw
568
         * @throws ReadDriverException
569
         * @throws LoadLayerException
570
         */
571
        private void rasterProcess(File file, Graphics2D g, ViewPort vp,
572
                        double scale, Cancellable cancel) throws ReadException,
573
                        LoadLayerException, FilterTypeException {
574

    
575
                // Cerramos el dataset asociado a la capa si est? abierto.
576
                if (layerRaster != null) {
577
                        layerRaster.setRemoveRasterFlag(true);
578
                        layerRaster.getDataSource().close();
579
                }
580

    
581
                // Cargamos el dataset con el raster de disco.
582
                layerRaster = FLyrRasterSE.createLayer("", file.getAbsolutePath(), vp
583
                                .getProjection());
584
                layerRaster.getRender()
585
                                .setBufferFactory(layerRaster.getBufferFactory());
586

    
587
                // Obtenemos la tabla de color del raster abierto ya que se le va a
588
                // sustituir la lista
589
                // de filtros y el de tabla de color no queremos sustituirlo.
590
                RasterFilterList rasterFilterList = layerRaster.getRender()
591
                                .getFilterList();
592
                ColorTableFilter ct = (ColorTableFilter) rasterFilterList
593
                                .getFilterByBaseClass(ColorTableFilter.class);
594
                Object param = null;
595
                if (ct != null)
596
                        param = ct.getParam("colorTable");
597

    
598
                // En caso de cargar un proyecto con XMLEntity se crean los filtros
599
                if (filterArguments != null) {
600
                        RasterFilterList fl = new RasterFilterList();
601
                        fl.addEnvParam("IStatistics", layerRaster.getDataSource()
602
                                        .getStatistics());
603
                        fl.addEnvParam("MultiRasterDataset", layerRaster.getDataSource());
604
                        fl.setInitDataType(layerRaster.getDataType()[0]);
605
                        RasterFilterListManager filterListManager = new RasterFilterListManager(
606
                                        fl);
607
                        filterListManager.createFilterListFromStrings(filterArguments);
608
                        filterArguments = null;
609
                        filterList = fl;
610
                }
611

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

    
636
                // Dibujamos
637
                layerRaster.draw(null, g, vp, cancel, scale);
638

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

    
649
        }
650

    
651
        /*
652
         * public void repaintRaster(Graphics2D g, ViewPort vp, File file) {
653
         * rasterProcess(file, g, vp, scale, cancel); rasterProcess(g, vpData,
654
         * file); }
655
         */
656

    
657
        public String getFormat() {
658
                return format;
659
        }
660

    
661
        public void setFormat(String f) {
662
                format = f;
663
        }
664

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

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

    
702
                return null;
703
        }
704

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

    
728
        public HashMap getProperties() {
729
                HashMap info = new HashMap();
730
                String[] layerNames = getLayerQuery().split(",");
731
                Vector layers = new Vector(layerNames.length);
732

    
733
                try {
734
                        if (((ArcImsImageDriver) getDriver()).connect(myCanc)) {
735
                                info.put("layerName", this.getName());
736
                                info.put("serverUrl", this.getHost());
737
                                info.put("serviceName", this.getService());
738
                                info.put("serviceType", this.getServiceType());
739
                                info.put("format", this.format);
740

    
741
                                for (int i = 0; i < layerNames.length; i++)
742
                                        layers.add(layerNames[i]);
743

    
744
                                info.put("layerIds", layers);
745

    
746
                                return info;
747
                        }
748
                } catch (Exception e) {
749
                        logger
750
                                        .error("Error while reading FRasterLyrArcIMS properties. ",
751
                                                        e);
752
                }
753

    
754
                return null;
755
        }
756

    
757
        public double getHeight() {
758
                return visualStatus.height;
759
        }
760

    
761
        public double getMaxX() {
762
                return visualStatus.maxX;
763
        }
764

    
765
        public double getMaxY() {
766
                return visualStatus.maxY;
767
        }
768

    
769
        public double getMinX() {
770
                return visualStatus.minX;
771
        }
772

    
773
        public double getMinY() {
774
                return visualStatus.minY;
775
        }
776

    
777
        public int[] getPixel(double wcx, double wcy) {
778
                return null;
779
        }
780

    
781
        public double getWidth() {
782
                return visualStatus.width;
783
        }
784

    
785
        public void setPos(int x, int y) {
786
                this.posX = x;
787
                this.posY = y;
788
        }
789

    
790
        public void setPosWC(double x, double y) {
791
                this.posXWC = x;
792
                this.posYWC = y;
793
        }
794

    
795
        // /**
796
        // *
797
        // * @return XMLEntity.
798
        // * @throws XMLException
799
        // */
800
        // public XMLEntity getXMLEntity() throws XMLException {
801
        // XMLEntity xml = super.getXMLEntity();
802
        //
803
        // xml.putProperty("fullExtent", StringUtilities.rect2String(fullExtent));
804
        // xml.putProperty("host", host.toExternalForm());
805
        // xml.putProperty("serviceName", service);
806
        // xml.putProperty("serviceType", serviceType);
807
        // xml.putProperty("layerQuery", layerQuery);
808
        // xml.putProperty("format", format);
809
        //
810
        // if (status != null) {
811
        // status.getXMLEntity(xml, true, this);
812
        // } else {
813
        // status = new StatusLayerRaster();
814
        // status.getXMLEntity(xml, true, this);
815
        // }
816
        //
817
        // xml.putProperty("arcims_transparency", arcImsTransparency);
818
        //
819
        // int cnt = 0;
820
        // boolean ex = true;
821
        // String kn = "raster.file";
822
        // while (ex) {
823
        // kn = "raster.file" + cnt;
824
        // try {
825
        // xml.getStringArrayProperty(kn);
826
        // xml.remove(kn);
827
        // } catch (Exception exc) {
828
        // ex = false;
829
        // }
830
        // cnt++;
831
        // }
832
        //
833
        // return xml;
834
        // }
835

    
836
        // /**
837
        // *
838
        // * @param xml
839
        // * XMLEntity
840
        // *
841
        // * @throws XMLException
842
        // * @throws DriverException
843
        // * @throws DriverIOException
844
        // */
845
        // public void setXMLEntity(XMLEntity xml) throws XMLException {
846
        //
847
        // super.setXMLEntity(xml);
848
        //
849
        // fullExtent = StringUtilities.string2Rect(xml
850
        // .getStringProperty("fullExtent"));
851
        //
852
        // try {
853
        // host = new URL(xml.getStringProperty("host"));
854
        // } catch (MalformedURLException e) {
855
        // logger.error("Whle reading XML file ", e);
856
        // throw new Exception(e);
857
        // }
858
        //
859
        // this.layerQuery = xml.getStringProperty("layerQuery");
860
        // this.service = xml.getStringProperty("serviceName");
861
        // this.serviceType = xml.getStringProperty("serviceType");
862
        // this.format = xml.getStringProperty("format");
863
        //
864
        // FMapRasterArcImsDriver drv = new FMapRasterArcImsDriver(
865
        // host.toString(), service, serviceType);
866
        //
867
        // if (!drv.connect(myCanc)) {
868
        // logger.error("Error while loading service information. ");
869
        // }
870
        //
871
        // ArcImsClientP cli = (ArcImsClientP) drv.getClient();
872
        // ServiceInformation si = cli.getServiceInformation();
873
        // this.arcimsStatus.setServiceInformation(si);
874
        //
875
        // if (xml.contains("arcims_transparency")) {
876
        // this.arcImsTransparency = xml
877
        // .getBooleanProperty("arcims_transparency");
878
        // }
879
        //
880
        // String claseStr = StatusLayerRaster.defaultClass;
881
        //
882
        // if (xml.contains("raster.class")) {
883
        // claseStr = xml.getStringProperty("raster.class");
884
        // }
885
        //
886
        // if (status != null) {
887
        // status.setXMLEntity(xml, this);
888
        // } else {
889
        // // When we load a project
890
        // if ((claseStr != null) && !claseStr.equals("")) {
891
        // try {
892
        // Class clase = Class.forName(claseStr);
893
        // Constructor constr = clase.getConstructor(null);
894
        // status = (IStatusRaster) constr.newInstance(null);
895
        //
896
        // if (status != null) {
897
        // status.setXMLEntity(xml, this);
898
        // filterArguments = status.getFilterArguments();
899
        // gridTransparency = status.getTransparency();
900
        // renderBands = status.getRenderBands();
901
        //
902
        // }
903
        // } catch (ClassNotFoundException exc) {
904
        // logger.error("Whle reading XML file ", exc);
905
        // } catch (InstantiationException exc) {
906
        // logger.error("Whle reading XML file ", exc);
907
        // } catch (IllegalAccessException exc) {
908
        // logger.error("Whle reading XML file ", exc);
909
        // } catch (NoSuchMethodException exc) {
910
        // logger.error("Whle reading XML file ", exc);
911
        // } catch (InvocationTargetException exc) {
912
        // logger.error("Whle reading XML file ", exc);
913
        // }
914
        // }
915
        // }
916
        //
917
        // firstLoad = true;
918
        // }
919

    
920
        public Vector getLayerScaleInfoVector() {
921
                Vector v = new Vector();
922
                String id;
923

    
924
                for (int i = 0; i < arcimsStatus.getLayerIds().size(); i++) {
925
                        id = (String) arcimsStatus.getLayerIds().get(i);
926
                        v.add(getScaleInfo(id));
927
                }
928

    
929
                return v;
930
        }
931

    
932
        public LayerScaleData getScaleInfo(String theId) {
933
                ServiceInformation si;
934
                ServiceInformationLayer sil;
935
                int noflayers;
936
                long true_max_scale;
937
                long true_min_scale;
938

    
939
                LayerScaleData theLayerScaleData = null;
940

    
941
                si = arcimsStatus.getServiceInfo();
942

    
943
                int _dpi = si.getScreen_dpi();
944
                String mapUnits = si.getMapunits();
945

    
946
                noflayers = si.getLayers().size();
947

    
948
                for (int i = 0; i < noflayers; i++) {
949
                        sil = (ServiceInformationLayer) si.getLayer(i);
950

    
951
                        if ((sil.getId().compareTo(theId)) == 0) {
952
                                true_max_scale = LayerScaleData
953
                                                .getTrueScaleFromRelativeScaleAndMapUnits(sil
954
                                                                .getMaxscale(), mapUnits, _dpi);
955
                                true_min_scale = LayerScaleData
956
                                                .getTrueScaleFromRelativeScaleAndMapUnits(sil
957
                                                                .getMinscale(), mapUnits, _dpi);
958
                                theLayerScaleData = new LayerScaleData(sil.getName(), sil
959
                                                .getId(), true_min_scale, true_max_scale, sil.getType());
960
                        }
961
                }
962

    
963
                return theLayerScaleData;
964
        }
965

    
966
        public void addActionlistener(ActionListener al) {
967
                if (actionListeners.contains(al)) {
968
                        return;
969
                }
970

    
971
                actionListeners.add(al);
972
        }
973

    
974
        public void removeActionlistener(ActionListener al) {
975
                actionListeners.remove(al);
976
        }
977

    
978
        private void callActionListeners(ActionEvent ae) {
979
                ActionListener al;
980

    
981
                for (int i = 0; i < actionListeners.size(); i++) {
982
                        al = (ActionListener) actionListeners.get(i);
983
                        al.actionPerformed(ae);
984
                }
985
        }
986

    
987
        public long getScale() {
988
                return getMapContext().getScaleView();
989
        }
990

    
991
        public int getMaxTileHeight() {
992
                return maxTileHeight;
993
        }
994

    
995
        public void setMaxTileHeight(int maxTileHeight) {
996
                this.maxTileHeight = maxTileHeight;
997
        }
998

    
999
        public int getMaxTileWidth() {
1000
                return maxTileWidth;
1001
        }
1002

    
1003
        public void setMaxTileWidth(int maxTileWidth) {
1004
                this.maxTileWidth = maxTileWidth;
1005
        }
1006

    
1007
        public void setServiceInformationInStatus(ServiceInformation si) {
1008
                this.arcimsStatus.setServiceInformation(si);
1009
        }
1010

    
1011
        /**
1012
         * This is the <tt>getDriver</tt> method. The <tt>getDriver</tt> method will
1013
         * be implemented by sub-classes.
1014
         * 
1015
         * @param d
1016
         *            the new driver.
1017
         */
1018
        public void setDriver(ArcImsImageDriver d) {
1019
                imageDriver = d;
1020
        }
1021

    
1022
        public ArcImsStatus getArcimsStatus() {
1023
                return arcimsStatus;
1024
        }
1025

    
1026
        public void setArcimsStatus(ArcImsStatus as) {
1027
                arcimsStatus = as;
1028
        }
1029

    
1030
        public boolean isFirstLoad() {
1031
                return firstLoad;
1032
        }
1033

    
1034
        public void setFirstLoad(boolean fl) {
1035
                firstLoad = fl;
1036
        }
1037

    
1038
        public URL getHost() {
1039
                return host;
1040
        }
1041

    
1042
        public void setHost(URL h) {
1043
                host = h;
1044
        }
1045

    
1046
        public String getLayerQuery() {
1047
                return layerQuery;
1048
        }
1049

    
1050
        public void setLayerQuery(String lQuery) {
1051
                this.layerQuery = lQuery;
1052

    
1053
                if (layerQuery.substring(0, 1).compareTo(",") == 0) {
1054
                        layerQuery = layerQuery.substring(1);
1055
                }
1056
        }
1057

    
1058
        public String getService() {
1059
                return service;
1060
        }
1061

    
1062
        public void setService(String s) {
1063
                service = s;
1064
        }
1065

    
1066
        public String getServiceType() {
1067
                return serviceType;
1068
        }
1069

    
1070
        public void setServiceType(String st) {
1071
                serviceType = st;
1072
        }
1073

    
1074
        public String getSRS() {
1075
                return SRS;
1076
        }
1077

    
1078
        public void setSRS(String srs) {
1079
                SRS = srs;
1080
        }
1081

    
1082
        public void setFullExtent(Rectangle2D fe) {
1083
                fullExtent = fe;
1084
        }
1085

    
1086
        public Rectangle2D getFullExtent() {
1087
                return fullExtent;
1088
        }
1089

    
1090
        public boolean getArcImsTransparency() {
1091
                return arcImsTransparency;
1092
        }
1093

    
1094
        public int getTransparency() {
1095
                return transparency;
1096
        }
1097

    
1098
        public void setTransparency(int transparency) {
1099
                this.transparency = transparency;
1100
        }
1101

    
1102
        public int getPosX() {
1103
                return posX;
1104
        }
1105

    
1106
        public void setPosX(int posX) {
1107
                this.posX = posX;
1108
        }
1109

    
1110
        public double getPosXWC() {
1111
                return posXWC;
1112
        }
1113

    
1114
        public void setPosXWC(double posXWC) {
1115
                this.posXWC = posXWC;
1116
        }
1117

    
1118
        public int getPosY() {
1119
                return posY;
1120
        }
1121

    
1122
        public void setPosY(int posY) {
1123
                this.posY = posY;
1124
        }
1125

    
1126
        public double getPosYWC() {
1127
                return posYWC;
1128
        }
1129

    
1130
        public void setPosYWC(double posYWC) {
1131
                this.posYWC = posYWC;
1132
        }
1133

    
1134
        public void setFormatInStatus(String imgFormat) {
1135
                arcimsStatus.setFormat(imgFormat);
1136
        }
1137

    
1138
        /**
1139
         * This method invoques the <tt>FMapRasterArcImsDriver</tt>'s
1140
         * <tt>getFeatureInfo</tt> method with the given coordinates as a parameter
1141
         * 
1142
         * @param p
1143
         *            the corrdinates of the screen pixel to be queried
1144
         * 
1145
         * @return the data retrieved for that pixel
1146
         * @throws DriverException
1147
         */
1148
        public Iterator getInfo(Point p, double tolerance, Cancellable cancel)
1149
                        throws ReadException {
1150
                // StringXMLItem[] resp = new StringXMLItem[1];
1151
                // String respStr;
1152
                //
1153
                // if (((FMapRasterArcImsDriver) driver).isQueryable()) {
1154
                // try {
1155
                // respStr = ((FMapRasterArcImsDriver) driver).getFeatureInfo(
1156
                // arcimsStatus, (int) p.getX(), (int) p.getY(),
1157
                // Integer.MAX_VALUE);
1158
                // } catch (ArcImsException e) {
1159
                // ReadException de = new ReadException(
1160
                // "While getting feature info. ", e);
1161
                // logger.error("In query by point ", e);
1162
                // throw de;
1163
                // }
1164
                // } else {
1165
                // ReadException de = new ReadException("Layer not queriable.",
1166
                // new Exception("Layer not queriable."));
1167
                // throw de;
1168
                // }
1169
                //
1170
                // System.err.println(resp); // TODO BORRAR ESTO
1171
                // resp[0] = new StringXMLItem(respStr, this);
1172

    
1173
                return null;
1174
        }
1175

    
1176
        public boolean isTiled() {
1177
                return tiled;
1178
        }
1179

    
1180
        public int[] getTileSize() {
1181
                return tileSize;
1182
        }
1183

    
1184
        private boolean isTrueString(String visible) {
1185
                if (visible.compareToIgnoreCase("true") == 0) {
1186
                        return true;
1187
                }
1188

    
1189
                return false;
1190
        }
1191

    
1192
        public void callNameOrQueryListeners() {
1193
                for (int i = 0; i < listeners.size(); i++) {
1194
                        ((FRasterLyrArcIMSListener) listeners.get(i)).thingsHaveChanged(
1195
                                        getLayerQuery(), getName());
1196
                }
1197
        }
1198

    
1199
        public void addNameOrQueryListener(FRasterLyrArcIMSListener l) {
1200
                if (!listeners.contains(l)) {
1201
                        listeners.add(l);
1202
                }
1203
        }
1204

    
1205
        public void removeNameOrQueryListener(FRasterLyrArcIMSListener l) {
1206
                listeners.remove(l);
1207
        }
1208

    
1209
        public void setNameQueryChange(boolean c) {
1210
                nameQueryChange = c;
1211
        }
1212

    
1213
        public String getTocImageIcon() {
1214
                // String resp = null;
1215
                //
1216
                // try {
1217
                // resp = createImageIcon("images/esrilogo.png");
1218
                // } catch (Exception ex) {
1219
                // }
1220
                //
1221
                // if (resp == null) {
1222
                // return super.getTocImageIcon();
1223
                // } else {
1224
                // return resp;
1225
                // }
1226
                return "images/esrilogo.png";
1227
        }
1228

    
1229
        protected ImageIcon createImageIcon(String path) {
1230
                java.net.URL imgURL = createExtensionUrl(path);
1231

    
1232
                if (imgURL != null) {
1233
                        return new ImageIcon(imgURL);
1234
                } else {
1235
                        logger.error("File not found: " + path);
1236

    
1237
                        return null;
1238
                }
1239
        }
1240

    
1241
        protected java.net.URL createExtensionUrl(String path) {
1242
                return PluginServices.getPluginServices(
1243
                                "es.prodevelop.cit.gvsig.arcims").getClassLoader().getResource(
1244
                                path);
1245

    
1246
                // return getClass().getClassLoader().getResource(path);
1247
        }
1248

    
1249
        public Grid getGrid() {
1250
                return grid;
1251
        }
1252

    
1253
        private class VisualStatusArcIms {
1254
                /**
1255
                 * Width and height of the image or the group of tiles if it have them.
1256
                 * It's the same dimensions of the viewport
1257
                 */
1258
                private int width = 0;
1259

    
1260
                /**
1261
                 * Width and height of the image or the group of tiles if it have them.
1262
                 * It's the same dimensions of the viewport
1263
                 */
1264
                private int height = 0;
1265
                private double minX = 0D;
1266
                private double minY = 0D;
1267
                private double maxX = 0D;
1268
                private double maxY = 0D;
1269
                private int bandCount = 0;
1270
                private int dataType = DataBuffer.TYPE_UNDEFINED;
1271
        }
1272

    
1273
        public RasterFilterList getRenderFilterList() {
1274
                return (filterList != null) ? filterList : getRender().getFilterList();
1275
        }
1276

    
1277
        /*
1278
         * (non-Javadoc)
1279
         * 
1280
         * @see
1281
         * org.gvsig.raster.hierarchy.IRasterRendering#setRenderFilterList(org.gvsig
1282
         * .raster.grid.filter.RasterFilterList)
1283
         */
1284
        public void setRenderFilterList(RasterFilterList filterList) {
1285
                this.filterList = filterList;
1286
                super.getRender().setFilterList(filterList);
1287
        }
1288

    
1289
        public void setRenderBands(int[] renderBands) {
1290
                this.renderBands = renderBands;
1291
                getRender().setRenderBands(renderBands);
1292
        }
1293

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

    
1330
        public GridTransparency getRenderTransparency() {
1331
                return (gridTransparency != null) ? gridTransparency : getRender()
1332
                                .getLastTransparency();
1333
        }
1334

    
1335
        public boolean isActionEnabled(int action) {
1336
                switch (action) {
1337
                case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
1338
                case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
1339
                case IRasterLayerActions.BANDS_FILE_LIST:
1340
                case IRasterLayerActions.COLOR_TABLE:
1341
                case IRasterLayerActions.GEOLOCATION:
1342
                case IRasterLayerActions.PANSHARPENING:
1343
                        return false;
1344
                case IRasterLayerActions.REMOTE_ACTIONS:
1345
                        return true;
1346
                }
1347

    
1348
                return super.isActionEnabled(action);
1349
        }
1350

    
1351
        public int[] getRenderBands() {
1352
                return (renderBands != null) ? renderBands : getRender()
1353
                                .getRenderBands();
1354
        }
1355

    
1356
        /*
1357
         * (non-Javadoc)
1358
         * 
1359
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#cloneLayer()
1360
         */
1361
        public FLayer cloneLayer() throws Exception {
1362
                FRasterLyrArcIMS layer = new FRasterLyrArcIMS();
1363
                layer.setHost(this.getHost());
1364
                layer.setName(this.getName());
1365
                layer.setSRS(this.getSRS());
1366
                layer.setFormat(this.getFormat());
1367
                layer.setFullExtent(this.fullExtent);
1368
                layer.setDriver(this.getDriver());
1369
                layer.setLayerQuery(this.layerQuery);
1370
                layer.setArcimsStatus(this.getArcimsStatus());
1371
                layer.visualStatus = this.visualStatus;
1372
                layer.setProjection(this.getProjection());
1373

    
1374
                ArrayList filters = getRender().getFilterList().getStatusCloned();
1375
                if (layer.getRender().getFilterList() == null)
1376
                        layer.getRender().setFilterList(new RasterFilterList());
1377
                layer.getRender().getFilterList().setStatus(filters);
1378

    
1379
                return layer;
1380
        }
1381

    
1382
}