Revision 271

View differences:

org.gvsig.educa.portableview/trunk/org.gvsig.educa.portableview/org.gvsig.educa.portableview.lib/org.gvsig.educa.portableview.lib.impl/src/main/java/org/gvsig/educa/portableview/impl/util/PersistenceUtils.java
68 68
			for (DynField field : fields) {
69 69
				if ((field.getName() == "uri" && field.getType() == org.gvsig.tools.dataTypes.DataTypes.STRING)) {
70 70
					String value = aState.getString(field.getName());
71
					if (value.startsWith("file:")) {
72
						File file = aState.getFile(field.getName());
73
						file = fixRelativeFilePath(file, rootFolder);
71
					if (value != null && value.startsWith("/")) {
72
						File file = fixRelativeFilePath(new File(value),
73
								rootFolder);
74 74
						aState.set(field.getName(), file);
75 75
					}
76 76
				} else if ((field.getName() == "fileName" && field.getType() == org.gvsig.tools.dataTypes.DataTypes.URI)) {
......
83 83
							e1.printStackTrace();
84 84
						}
85 85
					}
86
				}else if ((field.getType() == org.gvsig.tools.dataTypes.DataTypes.FILE)
86
				} else if ((field.getType() == org.gvsig.tools.dataTypes.DataTypes.FILE)
87 87
						|| (field.getType() == org.gvsig.tools.dataTypes.DataTypes.FOLDER)) {
88 88
					File value = aState.getFile(field.getName());
89 89
					value = fixRelativeFilePath(value, rootFolder);
......
159 159
				if (field.getName() == "uri"
160 160
						&& field.getType() == org.gvsig.tools.dataTypes.DataTypes.STRING) {
161 161
					String value = aState.getString(field.getName());
162
					// if value starts with / add file.
163
					if (value.startsWith("/")) {
162
					if (value != null && value.startsWith("/")) {
164 163
						relatedFiles.add(new File(value));
165 164
					}
166 165
				} else if ((field.getType() == org.gvsig.tools.dataTypes.DataTypes.FILE)
......
219 218
			for (DynField field : fields) {
220 219
				if ((field.getName() == "uri" && field.getType() == org.gvsig.tools.dataTypes.DataTypes.STRING)) {
221 220
					String value = aState.getString(field.getName());
222
					if (value.startsWith("file:")) {
221
					if (value != null && value.startsWith("/")) {
223 222
						File file = new File(value);
224 223
						file = getTransformedFile(file, transformMapping,
225 224
								missingFilesInMapping, rootFolder);
org.gvsig.educa.portableview/trunk/org.gvsig.educa.portableview/org.gvsig.educa.portableview.swing/org.gvsig.educa.portableview.swing.impl/src/main/java/org/gvsig/educa/portableview/swing/impl/viewer/DefaultPortableViewToc.java
43 43
import javax.swing.tree.TreePath;
44 44
import javax.swing.tree.TreeSelectionModel;
45 45

  
46
import org.gvsig.andami.IconThemeHelper;
46 47
import org.gvsig.educa.portableview.swing.impl.viewer.TocTreeNode.TYPE;
47 48
import org.gvsig.educa.portableview.swing.PortableViewSwingLocator;
48 49
import org.gvsig.educa.portableview.swing.PortableViewSwingManager;
......
79 80
 *
80 81
 */
81 82
public class DefaultPortableViewToc extends JPanel implements PortableViewToc,
82
    LayerListener, TreeSelectionListener {
83
		LayerListener, TreeSelectionListener {
83 84

  
84
    /**
85
	/**
85 86
     *
86 87
     */
87
    private static final long serialVersionUID = 3761640139439674486L;
88
	private static final long serialVersionUID = 3761640139439674486L;
88 89

  
89
    @SuppressWarnings("unused")
90
    private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory
91
        .getLogger(DefaultPortableViewToc.class);
90
	@SuppressWarnings("unused")
91
	private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory
92
			.getLogger(DefaultPortableViewToc.class);
92 93

  
93
    private static final FLayer[] EMPTY_SELECTION = new FLayer[0];
94
	private static final FLayer[] EMPTY_SELECTION = new FLayer[0];
94 95

  
95
    private PortableViewViewer viewer;
96
	private PortableViewViewer viewer;
96 97

  
97
    private boolean initialized;
98
	private boolean initialized;
98 99

  
99
    private JTree tree;
100
	private JTree tree;
100 101

  
101
    private FLayers rootLayer;
102
	private FLayers rootLayer;
102 103

  
103
    private TocTreeNode rootNode;
104
	private TocTreeNode rootNode;
104 105

  
105
    private DefaultTreeModel treeModel;
106
	private DefaultTreeModel treeModel;
106 107

  
107
    private PortableViewTocImageProvider imageProvider;
108
	private PortableViewTocImageProvider imageProvider;
108 109

  
109
    private TocTreeCellRenderer cellRenderer;
110
	private TocTreeCellRenderer cellRenderer;
110 111

  
111
    private boolean internalSelectionChanging;
112
	private boolean internalSelectionChanging;
112 113

  
113
    private final PortableViewSwingManager swingManager;
114
	private final PortableViewSwingManager swingManager;
114 115

  
115
    public DefaultPortableViewToc() {
116
        swingManager = PortableViewSwingLocator.getSwingManager();
117
        initialized = false;
118
        imageProvider = swingManager.getDefaultTocImageProvider();
119
    }
116
	public DefaultPortableViewToc() {
117
		swingManager = PortableViewSwingLocator.getSwingManager();
118
		initialized = false;
119
		imageProvider = swingManager.getDefaultTocImageProvider();
120
	}
120 121

  
121
    public void setImageProvider(PortableViewTocImageProvider imageProvider) {
122
        this.imageProvider = imageProvider;
122
	public void setImageProvider(PortableViewTocImageProvider imageProvider) {
123
		this.imageProvider = imageProvider;
123 124

  
124
        if (cellRenderer != null) {
125
            cellRenderer.setImageProvider(imageProvider);
126
        }
127
    }
125
		if (cellRenderer != null) {
126
			cellRenderer.setImageProvider(imageProvider);
127
		}
128
	}
128 129

  
129
    /**
130
     * Load tree model from mapContext
131
     */
132
    private void loadTreeModel() {
133
        rootLayer = getMapContext().getLayers();
134
        // rootNode = new LayerTreeNode(rootLayer);
135
        // rootLayer.addLayerCollectionListener(this);
136
        loadLayerNode(rootLayer, null);
137
        treeModel = new DefaultTreeModel(rootNode);
138
        tree.setModel(treeModel);
139
        tree.invalidate();
140
        tree.getSelectionModel().addTreeSelectionListener(this);
141
    }
130
	/**
131
	 * Load tree model from mapContext
132
	 */
133
	private void loadTreeModel() {
134
		rootLayer = getMapContext().getLayers();
135
		// rootNode = new LayerTreeNode(rootLayer);
136
		// rootLayer.addLayerCollectionListener(this);
137
		loadLayerNode(rootLayer, null);
138
		treeModel = new DefaultTreeModel(rootNode);
139
		tree.setModel(treeModel);
140
		tree.invalidate();
141
		tree.getSelectionModel().addTreeSelectionListener(this);
142
	}
142 143

  
143
    /**
144
     * Load a layer Node
145
     *
146
     * @param layer
147
     * @param parent
148
     */
149
    private void loadLayerNode(FLayer layer, TocTreeNode parent) {
150
        layer.addLayerListener(this);
151
        TocTreeNode node;
152
        if (layer instanceof LayerCollection) {
153
            LayerCollection collection = (LayerCollection) layer;
154
            node = new TocTreeNode((LayerCollection) layer);
155
            // collection.addLayerCollectionListener(this);
156
            for (int i = collection.getLayersCount(); i > 0; i--) {
157
                loadLayerNode(collection.getLayer(i-1), node);
158
            }
159
            if (parent == null) {
160
                rootNode = node;
161
            } else {
162
                parent.add(node);
163
            }
144
	/**
145
	 * Load a layer Node
146
	 *
147
	 * @param layer
148
	 * @param parent
149
	 */
150
	private void loadLayerNode(FLayer layer, TocTreeNode parent) {
151
		layer.addLayerListener(this);
152
		TocTreeNode node;
153
		if (layer instanceof LayerCollection) {
154
			LayerCollection collection = (LayerCollection) layer;
155
			node = new TocTreeNode((LayerCollection) layer);
156
			// collection.addLayerCollectionListener(this);
157
			for (int i = collection.getLayersCount(); i > 0; i--) {
158
				loadLayerNode(collection.getLayer(i - 1), node);
159
			}
160
			if (parent == null) {
161
				rootNode = node;
162
			} else {
163
				parent.add(node);
164
			}
164 165

  
165
        } else {
166
            loadSingleLayerNode((SingleLayer) layer, parent);
167
        }
166
		} else {
167
			loadSingleLayerNode((SingleLayer) layer, parent);
168
		}
168 169

  
169
    }
170
	}
170 171

  
171
    private void loadSingleLayerNode(SingleLayer layer, TocTreeNode parent) {
172
        TocTreeNode node;
173
        if (layer instanceof Classifiable) {
174
            Classifiable classifLayer = (Classifiable) layer;
175
            if (classifLayer.getLegend() != null) {
176
                loadLayerWithLegendNode(layer, classifLayer.getLegend(), parent);
177
                return;
178
            }
179
        }
180
        if (layer instanceof IHasImageLegend) {
181
            Image imgLegend = ((IHasImageLegend) layer).getImageLegend();
182
            loadLayerWithImageLegendNode(layer, imgLegend, parent);
183
            return;
184
        }
185
        node = new TocTreeNode(layer);
186
        parent.add(node);
187
    }
172
	private void loadSingleLayerNode(SingleLayer layer, TocTreeNode parent) {
173
		TocTreeNode node;
174
		if (layer instanceof Classifiable) {
175
			Classifiable classifLayer = (Classifiable) layer;
176
			if (classifLayer.getLegend() != null) {
177
				loadLayerWithLegendNode(layer, classifLayer.getLegend(), parent);
178
				return;
179
			}
180
		}
181
		if (layer instanceof IHasImageLegend) {
182
			if (layer.isAvailable()) {
183
				Image imgLegend = ((IHasImageLegend) layer).getImageLegend();
184
				loadLayerWithImageLegendNode(layer, imgLegend, parent);
185
			}else {
186
				loadLayerWithImageLegendNode(layer, null, parent);
187
			}
188
			return;
189
		}
190
		node = new TocTreeNode(layer);
191
		parent.add(node);
192
	}
188 193

  
189
    /**
190
     * @param layer
191
     * @param imgLegend
192
     * @param parent
193
     */
194
    private void loadLayerWithImageLegendNode(SingleLayer layer,
195
        Image imgLegend, TocTreeNode parent) {
196
        TocTreeNode node;
197
        if (imgLegend == null) {
198
            node = new TocTreeNode(layer);
199
        } else {
200
            node = new TocTreeNode(layer, imgLegend);
201
            TocTreeNode legendNode = new TocTreeNode(imgLegend, layer);
202
            node.add(legendNode);
203
        }
204
        parent.add(node);
205
    }
194
	/**
195
	 * @param layer
196
	 * @param imgLegend
197
	 * @param parent
198
	 */
199
	private void loadLayerWithImageLegendNode(SingleLayer layer,
200
			Image imgLegend, TocTreeNode parent) {
201
		TocTreeNode node;
202
		if (imgLegend == null) {
203
			node = new TocTreeNode(layer);
204
		} else {
205
			node = new TocTreeNode(layer, imgLegend);
206
			TocTreeNode legendNode = new TocTreeNode(imgLegend, layer);
207
			node.add(legendNode);
208
		}
209
		parent.add(node);
210
	}
206 211

  
207
    /**
208
     * @param layer
209
     * @param legend
210
     * @param parent
211
     */
212
    private void loadLayerWithLegendNode(SingleLayer layer, ILegend legend,
213
        TocTreeNode parent) {
214
        TocTreeNode node;
215
        ISymbol defSymbol = legend.getDefaultSymbol();
216
        if (legend instanceof IClassifiedLegend) {
217
            node = new TocTreeNode(layer, true);
218
            IClassifiedLegend cl = (IClassifiedLegend) legend;
219
            String[] descriptions = cl.getDescriptions();
220
            ISymbol[] symbols = cl.getSymbols();
212
	/**
213
	 * @param layer
214
	 * @param legend
215
	 * @param parent
216
	 */
217
	private void loadLayerWithLegendNode(SingleLayer layer, ILegend legend,
218
			TocTreeNode parent) {
219
		TocTreeNode node;
220
		ISymbol defSymbol = legend.getDefaultSymbol();
221
		if (legend instanceof IClassifiedLegend) {
222
			node = new TocTreeNode(layer, true);
223
			IClassifiedLegend cl = (IClassifiedLegend) legend;
224
			String[] descriptions = cl.getDescriptions();
225
			ISymbol[] symbols = cl.getSymbols();
221 226

  
222
            TocTreeNode symNode;
223
            for (int j = 0; j < descriptions.length; j++) {
224
                symNode = new TocTreeNode(symbols[j], descriptions[j], layer);
225
                node.add(symNode);
226
            }
227
        } else
228
            if (legend instanceof ISingleSymbolLegend && defSymbol != null) {
229
                node = new TocTreeNode(layer, true);
227
			TocTreeNode symNode;
228
			for (int j = 0; j < descriptions.length; j++) {
229
				symNode = new TocTreeNode(symbols[j], descriptions[j], layer);
230
				node.add(symNode);
231
			}
232
		} else if (legend instanceof ISingleSymbolLegend && defSymbol != null) {
233
			node = new TocTreeNode(layer, true);
230 234

  
231
                TocTreeNode symNode =
232
                    new TocTreeNode(defSymbol, defSymbol.getDescription(),
233
                        layer);
234
                node.add(symNode);
235
			TocTreeNode symNode = new TocTreeNode(defSymbol,
236
					defSymbol.getDescription(), layer);
237
			node.add(symNode);
235 238

  
236
            } else {
237
                node = new TocTreeNode(layer, false);
238
            }
239
        parent.add(node);
240
    }
239
		} else {
240
			node = new TocTreeNode(layer, false);
241
		}
242
		parent.add(node);
243
	}
241 244

  
242
    private List<TocTreeNode> getNodesFromType(TYPE... types) {
243
        List<TocTreeNode> nodesFound = new ArrayList<TocTreeNode>();
244
        getNodesFromType(rootNode, nodesFound, types);
245
	private List<TocTreeNode> getNodesFromType(TYPE... types) {
246
		List<TocTreeNode> nodesFound = new ArrayList<TocTreeNode>();
247
		getNodesFromType(rootNode, nodesFound, types);
245 248

  
246
        return nodesFound;
247
    }
249
		return nodesFound;
250
	}
248 251

  
249
    private void getNodesFromType(TocTreeNode node,
250
        List<TocTreeNode> nodesFound, TYPE... types) {
251
        for (TYPE type : types) {
252
            if (node.getType() == type) {
253
                nodesFound.add(node);
254
            }
255
        }
256
        for (int index = 0; index < node.getChildCount(); index++) {
257
            getNodesFromType((TocTreeNode) node.getChildAt(index), nodesFound,
258
                types);
259
        }
260
    }
252
	private void getNodesFromType(TocTreeNode node,
253
			List<TocTreeNode> nodesFound, TYPE... types) {
254
		for (TYPE type : types) {
255
			if (node.getType() == type) {
256
				nodesFound.add(node);
257
			}
258
		}
259
		for (int index = 0; index < node.getChildCount(); index++) {
260
			getNodesFromType((TocTreeNode) node.getChildAt(index), nodesFound,
261
					types);
262
		}
263
	}
261 264

  
262
    /** {@inheridDoc} */
263
    public JComponent getSwingComponent() {
264
        if (viewer == null) {
265
            throw new IllegalStateException("Viewer not set yet");
266
        }
267
        return this;
268
    }
265
	/** {@inheridDoc} */
266
	public JComponent getSwingComponent() {
267
		if (viewer == null) {
268
			throw new IllegalStateException("Viewer not set yet");
269
		}
270
		return this;
271
	}
269 272

  
270
    /** {@inheridDoc} */
271
    public FLayer[] getSelectedLayers() {
272
        if (viewer == null) {
273
            throw new IllegalStateException("Viewer not set yet");
274
        }
273
	/** {@inheridDoc} */
274
	public FLayer[] getSelectedLayers() {
275
		if (viewer == null) {
276
			throw new IllegalStateException("Viewer not set yet");
277
		}
275 278

  
276
        List<FLayer> selectedLayers = new ArrayList<FLayer>();
277
        TocTreeNode node;
278
        TreePath[] paths = tree.getSelectionPaths();
279
		List<FLayer> selectedLayers = new ArrayList<FLayer>();
280
		TocTreeNode node;
281
		TreePath[] paths = tree.getSelectionPaths();
279 282

  
280
        if (paths != null && paths.length > 0) {
281
            for (TreePath path : paths) {
282
                node = (TocTreeNode) path.getLastPathComponent();
283
                if (node.isLayer()) {
284
                    selectedLayers.add(node.getLayer());
285
                }
286
            }
287
        } else {
288
            return EMPTY_SELECTION;
289
        }
283
		if (paths != null && paths.length > 0) {
284
			for (TreePath path : paths) {
285
				node = (TocTreeNode) path.getLastPathComponent();
286
				if (node.isLayer()) {
287
					selectedLayers.add(node.getLayer());
288
				}
289
			}
290
		} else {
291
			return EMPTY_SELECTION;
292
		}
290 293

  
291
        return selectedLayers.toArray(EMPTY_SELECTION);
292
    }
294
		return selectedLayers.toArray(EMPTY_SELECTION);
295
	}
293 296

  
294
    /** {@inheridDoc} */
295
    public void attachTo(PortableViewViewer viewer) {
296
        if (this.viewer != null && !this.viewer.equals(viewer)) {
297
            throw new IllegalStateException("Viewer already attached");
298
        }
299
        this.viewer = viewer;
300
        initializeUI();
301
        loadTreeModel();
302
    }
297
	/** {@inheridDoc} */
298
	public void attachTo(PortableViewViewer viewer) {
299
		if (this.viewer != null && !this.viewer.equals(viewer)) {
300
			throw new IllegalStateException("Viewer already attached");
301
		}
302
		this.viewer = viewer;
303
		initializeUI();
304
		loadTreeModel();
305
	}
303 306

  
304
    /** {@inheridDoc} */
305
    public PortableViewViewer getViewer() {
306
        return viewer;
307
    }
307
	/** {@inheridDoc} */
308
	public PortableViewViewer getViewer() {
309
		return viewer;
310
	}
308 311

  
309
    /**
310
     * Initialize User Interface components
311
     */
312
    private void initializeUI() {
313
        if (initialized) {
314
            return;
315
        }
316
        setLayout(new BorderLayout());
312
	/**
313
	 * Initialize User Interface components
314
	 */
315
	private void initializeUI() {
316
		if (initialized) {
317
			return;
318
		}
319
		setLayout(new BorderLayout());
317 320

  
318
        tree = new JTree();
321
		tree = new JTree();
319 322

  
320
        cellRenderer = new TocTreeCellRenderer();
321
        if (imageProvider != null) {
322
            cellRenderer.setImageProvider(imageProvider);
323
        }
323
		cellRenderer = new TocTreeCellRenderer();
324
		if (imageProvider != null) {
325
			cellRenderer.setImageProvider(imageProvider);
326
		}
324 327

  
325
        tree.setCellRenderer(cellRenderer);
328
		tree.setCellRenderer(cellRenderer);
326 329

  
327
        tree.setRootVisible(false);
330
		tree.setRootVisible(false);
328 331

  
329
        tree.getSelectionModel().setSelectionMode(
330
            TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
332
		tree.getSelectionModel().setSelectionMode(
333
				TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
331 334

  
332
        add(new JScrollPane(tree), BorderLayout.CENTER);
335
		add(new JScrollPane(tree), BorderLayout.CENTER);
333 336

  
334
        tree.addMouseListener(new MouseListener() {
337
		tree.addMouseListener(new MouseListener() {
335 338

  
336
            public void mouseReleased(MouseEvent e) {
337
                processTreeMouseEvent(e);
338
            }
339
			public void mouseReleased(MouseEvent e) {
340
				processTreeMouseEvent(e);
341
			}
339 342

  
340
            public void mousePressed(MouseEvent e) {
341
                processTreeMouseEvent(e);
342
            }
343
			public void mousePressed(MouseEvent e) {
344
				processTreeMouseEvent(e);
345
			}
343 346

  
344
            public void mouseExited(MouseEvent e) {
345
                processTreeMouseEvent(e);
346
            }
347
			public void mouseExited(MouseEvent e) {
348
				processTreeMouseEvent(e);
349
			}
347 350

  
348
            public void mouseEntered(MouseEvent e) {
349
                processTreeMouseEvent(e);
350
            }
351
			public void mouseEntered(MouseEvent e) {
352
				processTreeMouseEvent(e);
353
			}
351 354

  
352
            public void mouseClicked(MouseEvent e) {
353
                processTreeMouseEvent(e);
354
            }
355
        });
355
			public void mouseClicked(MouseEvent e) {
356
				processTreeMouseEvent(e);
357
			}
358
		});
356 359

  
357
        setMinimumSize(new Dimension(200, 100));
360
		setMinimumSize(new Dimension(200, 100));
358 361

  
359
        initialized = true;
360
    }
362
		initialized = true;
363
	}
361 364

  
362
    /**
363
     * Locates the layer node in all tree structure from root
364
     *
365
     * @param layer
366
     * @return
367
     */
368
    private DefaultMutableTreeNode findLayerNode(FLayer layer) {
369
        if (rootNode == null) {
370
            return null;
371
        }
372
        return findLayerNode(rootNode, layer);
373
    }
365
	/**
366
	 * Locates the layer node in all tree structure from root
367
	 *
368
	 * @param layer
369
	 * @return
370
	 */
371
	private DefaultMutableTreeNode findLayerNode(FLayer layer) {
372
		if (rootNode == null) {
373
			return null;
374
		}
375
		return findLayerNode(rootNode, layer);
376
	}
374 377

  
375
    /**
376
     * Locates the layer node in all tree structure from root
377
     *
378
     * @param node
379
     * @param layer
380
     * @return
381
     */
382
    private TocTreeNode findLayerNode(TocTreeNode node, FLayer layer) {
383
        if (node.getLayer() == layer) {
384
            return node;
385
        }
386
        if (node.isLeaf()) {
387
            return null;
388
        }
389
        TocTreeNode aNode;
390
        TocTreeNode result;
391
        for (int i = 0; i < node.getChildCount(); i++) {
392
            aNode = (TocTreeNode) node.getChildAt(i);
393
            result = findLayerNode(aNode, layer);
394
            if (result != null) {
395
                return result;
396
            }
397
        }
398
        return null;
378
	/**
379
	 * Locates the layer node in all tree structure from root
380
	 *
381
	 * @param node
382
	 * @param layer
383
	 * @return
384
	 */
385
	private TocTreeNode findLayerNode(TocTreeNode node, FLayer layer) {
386
		if (node.getLayer() == layer) {
387
			return node;
388
		}
389
		if (node.isLeaf()) {
390
			return null;
391
		}
392
		TocTreeNode aNode;
393
		TocTreeNode result;
394
		for (int i = 0; i < node.getChildCount(); i++) {
395
			aNode = (TocTreeNode) node.getChildAt(i);
396
			result = findLayerNode(aNode, layer);
397
			if (result != null) {
398
				return result;
399
			}
400
		}
401
		return null;
399 402

  
400
    }
403
	}
401 404

  
402
    public DynObject getParameters() {
403
        // TODO Auto-generated method stub
404
        return null;
405
    }
405
	public DynObject getParameters() {
406
		// TODO Auto-generated method stub
407
		return null;
408
	}
406 409

  
407
    public TOCFactory getFactory() {
408
        // TODO Auto-generated method stub
409
        return null;
410
    }
410
	public TOCFactory getFactory() {
411
		// TODO Auto-generated method stub
412
		return null;
413
	}
411 414

  
412
    public JComponent getComponent() {
413
        return getSwingComponent();
414
    }
415
	public JComponent getComponent() {
416
		return getSwingComponent();
417
	}
415 418

  
416
    public MapContext getMapContext() {
417
        if (viewer == null) {
418
            return null;
419
        }
420
        return viewer.getPortableView().getMapContext();
421
    }
419
	public MapContext getMapContext() {
420
		if (viewer == null) {
421
			return null;
422
		}
423
		return viewer.getPortableView().getMapContext();
424
	}
422 425

  
423
    public void showAll() {
424
        List<TocTreeNode> nodes = getNodesFromType(TYPE.values());
425
        for (TocTreeNode node : nodes) {
426
            tree.expandPath(new TreePath(node.getPath()));
427
        }
428
    }
426
	public void showAll() {
427
		List<TocTreeNode> nodes = getNodesFromType(TYPE.values());
428
		for (TocTreeNode node : nodes) {
429
			tree.expandPath(new TreePath(node.getPath()));
430
		}
431
	}
429 432

  
430
    public void hideAll() {
431
        DefaultMutableTreeNode node;
432
        for (int i = rootNode.getChildCount(); i < rootNode.getChildCount(); i++) {
433
            node = (DefaultMutableTreeNode) rootNode.getChildAt(i);
434
            tree.collapsePath(new TreePath(node.getPath()));
435
        }
433
	public void hideAll() {
434
		DefaultMutableTreeNode node;
435
		for (int i = rootNode.getChildCount(); i < rootNode.getChildCount(); i++) {
436
			node = (DefaultMutableTreeNode) rootNode.getChildAt(i);
437
			tree.collapsePath(new TreePath(node.getPath()));
438
		}
436 439

  
437
    }
440
	}
438 441

  
439
    public void showAllLegends() {
440
        List<TocTreeNode> nodes =
441
            getNodesFromType(TYPE.LAYER_WITH_LEGEND,
442
                TYPE.LAYER_WITH_IMAGE_LEGEND);
443
        for (TocTreeNode node : nodes) {
444
            tree.expandPath(new TreePath(node.getPath()));
445
        }
446
    }
442
	public void showAllLegends() {
443
		List<TocTreeNode> nodes = getNodesFromType(TYPE.LAYER_WITH_LEGEND,
444
				TYPE.LAYER_WITH_IMAGE_LEGEND);
445
		for (TocTreeNode node : nodes) {
446
			tree.expandPath(new TreePath(node.getPath()));
447
		}
448
	}
447 449

  
448
    public void hideAllLegends() {
449
        List<TocTreeNode> nodes =
450
            getNodesFromType(TYPE.LAYER_WITH_LEGEND,
451
                TYPE.LAYER_WITH_IMAGE_LEGEND);
452
        for (TocTreeNode node : nodes) {
453
            tree.collapsePath(new TreePath(node.getPath()));
454
        }
455
    }
450
	public void hideAllLegends() {
451
		List<TocTreeNode> nodes = getNodesFromType(TYPE.LAYER_WITH_LEGEND,
452
				TYPE.LAYER_WITH_IMAGE_LEGEND);
453
		for (TocTreeNode node : nodes) {
454
			tree.collapsePath(new TreePath(node.getPath()));
455
		}
456
	}
456 457

  
457
    public void show(FLayer lyr, boolean detailed) {
458
        DefaultMutableTreeNode node = findLayerNode(lyr);
459
        if (detailed && node.getChildCount() > 0) {
460
            node = (DefaultMutableTreeNode) node.getFirstChild();
461
        }
462
        tree.scrollPathToVisible(new TreePath(node.getPath()));
463
    }
458
	public void show(FLayer lyr, boolean detailed) {
459
		DefaultMutableTreeNode node = findLayerNode(lyr);
460
		if (detailed && node.getChildCount() > 0) {
461
			node = (DefaultMutableTreeNode) node.getFirstChild();
462
		}
463
		tree.scrollPathToVisible(new TreePath(node.getPath()));
464
	}
464 465

  
465
    public void showLegend(FLayer lyr) {
466
        show(lyr, true);
467
    }
466
	public void showLegend(FLayer lyr) {
467
		show(lyr, true);
468
	}
468 469

  
469
    public void hideLegend(FLayer lyr) {
470
        DefaultMutableTreeNode node = findLayerNode(lyr);
471
        tree.collapsePath(new TreePath(node.getPath()));
472
    }
470
	public void hideLegend(FLayer lyr) {
471
		DefaultMutableTreeNode node = findLayerNode(lyr);
472
		tree.collapsePath(new TreePath(node.getPath()));
473
	}
473 474

  
474
    public void selectLayer(FLayer lyr) {
475
        DefaultMutableTreeNode node = findLayerNode(lyr);
476
        tree.getSelectionModel().addSelectionPath(new TreePath(node.getPath()));
477
    }
475
	public void selectLayer(FLayer lyr) {
476
		DefaultMutableTreeNode node = findLayerNode(lyr);
477
		tree.getSelectionModel().addSelectionPath(new TreePath(node.getPath()));
478
	}
478 479

  
479
    public void unselectLayer(FLayer lyr) {
480
        DefaultMutableTreeNode node = findLayerNode(lyr);
481
        tree.getSelectionModel().removeSelectionPath(
482
            new TreePath(node.getPath()));
483
    }
480
	public void unselectLayer(FLayer lyr) {
481
		DefaultMutableTreeNode node = findLayerNode(lyr);
482
		tree.getSelectionModel().removeSelectionPath(
483
				new TreePath(node.getPath()));
484
	}
484 485

  
485
    public void clearSelection() {
486
        tree.clearSelection();
487
    }
486
	public void clearSelection() {
487
		tree.clearSelection();
488
	}
488 489

  
489
    public void setActiveLayer(FLayer lyr) {
490
        TocTreeNode node = (TocTreeNode) findLayerNode(lyr);
491
        tree.getSelectionModel().setSelectionPath(new TreePath(node.getPath()));
492
    }
490
	public void setActiveLayer(FLayer lyr) {
491
		TocTreeNode node = (TocTreeNode) findLayerNode(lyr);
492
		tree.getSelectionModel().setSelectionPath(new TreePath(node.getPath()));
493
	}
493 494

  
494
    public FLayer getActiveLayer() {
495
        if (tree.getSelectionCount() < 1) {
496
            return null;
497
        }
498
        TocTreeNode node =
499
            (TocTreeNode) tree.getSelectionPath().getLastPathComponent();
500
        if (!node.isLayer()) {
501
            return null;
502
        }
503
        return node.getLayer();
504
    }
495
	public FLayer getActiveLayer() {
496
		if (tree.getSelectionCount() < 1) {
497
			return null;
498
		}
499
		TocTreeNode node = (TocTreeNode) tree.getSelectionPath()
500
				.getLastPathComponent();
501
		if (!node.isLayer()) {
502
			return null;
503
		}
504
		return node.getLayer();
505
	}
505 506

  
506
    public void invokeAction(FLayer lyr, String action) {
507
        throw new UnsupportedOperationException();
508
    }
507
	public void invokeAction(FLayer lyr, String action) {
508
		throw new UnsupportedOperationException();
509
	}
509 510

  
510
    public void addLegendActionListener(LegendActionEventListener lel) {
511
        throw new UnsupportedOperationException();
512
    }
511
	public void addLegendActionListener(LegendActionEventListener lel) {
512
		throw new UnsupportedOperationException();
513
	}
513 514

  
514
    public void removeLegendActionListener(LegendActionEventListener lel) {
515
        throw new UnsupportedOperationException();
516
    }
515
	public void removeLegendActionListener(LegendActionEventListener lel) {
516
		throw new UnsupportedOperationException();
517
	}
517 518

  
518
    public void addLayerActionListener(LayerActionEventListener lel) {
519
        throw new UnsupportedOperationException();
520
    }
519
	public void addLayerActionListener(LayerActionEventListener lel) {
520
		throw new UnsupportedOperationException();
521
	}
521 522

  
522
    public void removeLayerActionListener(LayerActionEventListener lel) {
523
        throw new UnsupportedOperationException();
524
    }
523
	public void removeLayerActionListener(LayerActionEventListener lel) {
524
		throw new UnsupportedOperationException();
525
	}
525 526

  
526
    public void addActiveLayerChangeListener(
527
        ActiveLayerChangeEventListener alcel) {
528
        throw new UnsupportedOperationException();
529
    }
527
	public void addActiveLayerChangeListener(
528
			ActiveLayerChangeEventListener alcel) {
529
		throw new UnsupportedOperationException();
530
	}
530 531

  
531
    public void removeActiveLayerChangeListener(
532
        ActiveLayerChangeEventListener alcel) {
533
        throw new UnsupportedOperationException();
534
    }
532
	public void removeActiveLayerChangeListener(
533
			ActiveLayerChangeEventListener alcel) {
534
		throw new UnsupportedOperationException();
535
	}
535 536

  
536
    public Manager getManager() {
537
        // Nothing to do
538
        return null;
539
    }
537
	public Manager getManager() {
538
		// Nothing to do
539
		return null;
540
	}
540 541

  
541
    public void visibilityChanged(LayerEvent e) {
542
        DefaultMutableTreeNode node = findLayerNode(e.getSource());
543
        treeModel.nodeChanged(node);
544
    }
542
	public void visibilityChanged(LayerEvent e) {
543
		DefaultMutableTreeNode node = findLayerNode(e.getSource());
544
		treeModel.nodeChanged(node);
545
	}
545 546

  
546
    public void activationChanged(LayerEvent e) {
547
        if (internalSelectionChanging) {
548
            return;
549
        }
550
        FLayer layer = e.getSource();
551
        TocTreeNode node = (TocTreeNode) findLayerNode(layer);
552
        TreePath path = new TreePath(node.getPath());
553
        if (layer.isActive()) {
554
            tree.addSelectionPath(path);
555
        } else {
556
            tree.removeSelectionPath(path);
557
        }
558
    }
547
	public void activationChanged(LayerEvent e) {
548
		if (internalSelectionChanging) {
549
			return;
550
		}
551
		FLayer layer = e.getSource();
552
		TocTreeNode node = (TocTreeNode) findLayerNode(layer);
553
		TreePath path = new TreePath(node.getPath());
554
		if (layer.isActive()) {
555
			tree.addSelectionPath(path);
556
		} else {
557
			tree.removeSelectionPath(path);
558
		}
559
	}
559 560

  
560
    public void nameChanged(LayerEvent e) {
561
        DefaultMutableTreeNode node = findLayerNode(e.getSource());
562
        treeModel.nodeChanged(node);
563
    }
561
	public void nameChanged(LayerEvent e) {
562
		DefaultMutableTreeNode node = findLayerNode(e.getSource());
563
		treeModel.nodeChanged(node);
564
	}
564 565

  
565
    public void editionChanged(LayerEvent e) {
566
        // Nothing to do
567
    }
566
	public void editionChanged(LayerEvent e) {
567
		// Nothing to do
568
	}
568 569

  
569
    public void drawValueChanged(LayerEvent e) {
570
        // Nothing to do
571
    }
570
	public void drawValueChanged(LayerEvent e) {
571
		// Nothing to do
572
	}
572 573

  
573
    protected void processTreeMouseEvent(MouseEvent e) {
574
        if (!tree.isEnabled()) {
575
            return;
576
        }
577
        if (e.getID() != MouseEvent.MOUSE_CLICKED) {
578
            return;
579
        }
580
        int x = e.getX();
581
        int y = e.getY();
582
        int row = tree.getRowForLocation(x, y);
583
        if (row < 0) {
584
            return;
585
        }
586
        // click inside some node
587
        Rectangle rect = tree.getRowBounds(row);
588
        if (rect == null) {
589
            return;
590
        }
574
	protected void processTreeMouseEvent(MouseEvent e) {
575
		if (!tree.isEnabled()) {
576
			return;
577
		}
578
		if (e.getID() != MouseEvent.MOUSE_CLICKED) {
579
			return;
580
		}
581
		int x = e.getX();
582
		int y = e.getY();
583
		int row = tree.getRowForLocation(x, y);
584
		if (row < 0) {
585
			return;
586
		}
587
		// click inside some node
588
		Rectangle rect = tree.getRowBounds(row);
589
		if (rect == null) {
590
			return;
591
		}
591 592

  
592
        // Get the node
593
        TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
594
        final TocTreeNode node = (TocTreeNode) selPath.getLastPathComponent();
595
        if (!node.isLayer() || !node.getLayer().isAvailable()) {
596
            // no layer or unavailable layer: do nothing
597
            return;
598
        }
593
		// Get the node
594
		TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
595
		final TocTreeNode node = (TocTreeNode) selPath.getLastPathComponent();
596
		if (!node.isLayer() || !node.getLayer().isAvailable()) {
597
			// no layer or unavailable layer: do nothing
598
			return;
599
		}
599 600

  
600
        // click on a valid node
601
        TocTreeCellRenderer renderer =
602
            (TocTreeCellRenderer) tree.getCellRenderer();
603
        // adjust renderer for node and check box has been clicked
604
        renderer.getTreeCellRendererComponent(tree, node, false, false, false,
605
            row, false);
606
        if (!renderer.isOnCheck(x - rect.x, y - rect.y)) {
607
            return;
608
        }
609
        SwingUtilities.invokeLater(new Runnable() {
601
		// click on a valid node
602
		TocTreeCellRenderer renderer = (TocTreeCellRenderer) tree
603
				.getCellRenderer();
604
		// adjust renderer for node and check box has been clicked
605
		renderer.getTreeCellRendererComponent(tree, node, false, false, false,
606
				row, false);
607
		if (!renderer.isOnCheck(x - rect.x, y - rect.y)) {
608
			return;
609
		}
610
		SwingUtilities.invokeLater(new Runnable() {
610 611

  
611
            public void run() {
612
                swichLayerVisibilid(node);
613
            }
614
        });
615
    }
612
			public void run() {
613
				swichLayerVisibilid(node);
614
			}
615
		});
616
	}
616 617

  
617
    /**
618
     * @param node
619
     */
620
    private void swichLayerVisibilid(TocTreeNode node) {
621
        if (!node.isLayer()) {
622
            return;
623
        }
624
        FLayer layer = node.getLayer();
625
        setLayerVisibilid(node, !layer.isVisible());
626
    }
618
	/**
619
	 * @param node
620
	 */
621
	private void swichLayerVisibilid(TocTreeNode node) {
622
		if (!node.isLayer()) {
623
			return;
624
		}
625
		FLayer layer = node.getLayer();
626
		setLayerVisibilid(node, !layer.isVisible());
627
	}
627 628

  
628
    private void setLayerVisibilid(TocTreeNode node, boolean newValue) {
629
        if (node.isLayer()) {
630
            FLayer layer = node.getLayer();
631
            layer.setVisible(newValue);
632
            treeModel.nodeChanged(node);
633
        }
634
        if (node.isLeaf()) {
635
            return;
636
        }
637
        TocTreeNode child;
638
        for (int index = 0; index < node.getChildCount(); index++) {
639
            child = (TocTreeNode) node.getChildAt(index);
640
            setLayerVisibilid(child, newValue);
641
        }
642
    }
629
	private void setLayerVisibilid(TocTreeNode node, boolean newValue) {
630
		if (node.isLayer()) {
631
			FLayer layer = node.getLayer();
632
			layer.setVisible(newValue);
633
			treeModel.nodeChanged(node);
634
		}
635
		if (node.isLeaf()) {
636
			return;
637
		}
638
		TocTreeNode child;
639
		for (int index = 0; index < node.getChildCount(); index++) {
640
			child = (TocTreeNode) node.getChildAt(index);
641
			setLayerVisibilid(child, newValue);
642
		}
643
	}
643 644

  
644
    public void valueChanged(TreeSelectionEvent e) {
645
        internalSelectionChanging = true;
645
	public void valueChanged(TreeSelectionEvent e) {
646
		internalSelectionChanging = true;
646 647

  
647
        getMapContext().beginAtomicEvent();
648
		getMapContext().beginAtomicEvent();
648 649

  
649
        List<FLayer> prevActives =
650
            new ArrayList<FLayer>(Arrays.asList(rootLayer.getActives()));
650
		List<FLayer> prevActives = new ArrayList<FLayer>(
651
				Arrays.asList(rootLayer.getActives()));
651 652

  
652
        TreePath[] selectedPaths = e.getPaths();
653
		TreePath[] selectedPaths = e.getPaths();
653 654

  
654
        List<FLayer> newActives = new ArrayList<FLayer>(selectedPaths.length);
655
		List<FLayer> newActives = new ArrayList<FLayer>(selectedPaths.length);
655 656

  
656
        // mark new active
657
        TocTreeNode node;
658
        FLayer layer;
659
        for (TreePath path : selectedPaths) {
660
            node = (TocTreeNode) path.getLastPathComponent();
661
            if (node.isLayer()) {
662
                layer = node.getLayer();
663
                if (!layer.isActive()) {
664
                    layer.setActive(true);
665
                } else {
666
                    prevActives.remove(layer);
667
                }
668
                newActives.add(layer);
669
            }
670
        }
657
		// mark new active
658
		TocTreeNode node;
659
		FLayer layer;
660
		for (TreePath path : selectedPaths) {
661
			node = (TocTreeNode) path.getLastPathComponent();
662
			if (node.isLayer()) {
663
				layer = node.getLayer();
664
				if (!layer.isActive()) {
665
					layer.setActive(true);
666
				} else {
667
					prevActives.remove(layer);
668
				}
669
				newActives.add(layer);
670
			}
671
		}
671 672

  
672
        // Clear the previous
673
        for (FLayer aLayer : prevActives) {
674
            aLayer.setActive(false);
675
        }
673
		// Clear the previous
674
		for (FLayer aLayer : prevActives) {
675
			aLayer.setActive(false);
676
		}
676 677

  
677
        getMapContext().endAtomicEvent();
678
        internalSelectionChanging = false;
679
    }
678
		getMapContext().endAtomicEvent();
679
		internalSelectionChanging = false;
680
	}
680 681
}

Also available in: Unified diff