001: /*
002: * The Unified Mapping Platform (JUMP) is an extensible, interactive GUI
003: * for visualizing and manipulating spatial features with geometry and attributes.
004: *
005: * Copyright (C) 2003 Vivid Solutions
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: *
021: * For more information, contact:
022: *
023: * Vivid Solutions
024: * Suite #1A
025: * 2328 Government Street
026: * Victoria BC V8T 5G5
027: * Canada
028: *
029: * (250)385-6040
030: * www.vividsolutions.com
031: */
032:
033: package com.vividsolutions.jump.workbench.ui.style;
034:
035: import java.awt.BorderLayout;
036: import java.awt.Component;
037: import java.util.*;
038:
039: import javax.swing.DefaultListCellRenderer;
040: import javax.swing.JLabel;
041: import javax.swing.JList;
042: import javax.swing.JPanel;
043: import javax.swing.ListCellRenderer;
044:
045: import com.vividsolutions.jts.util.Assert;
046: import com.vividsolutions.jump.I18N;
047: import com.vividsolutions.jump.workbench.model.Layer;
048: import com.vividsolutions.jump.workbench.ui.addremove.AddRemovePanel;
049: import com.vividsolutions.jump.workbench.ui.addremove.DefaultAddRemoveList;
050: import com.vividsolutions.jump.workbench.ui.addremove.DefaultAddRemoveListModel;
051: import com.vividsolutions.jump.workbench.ui.renderer.style.ChoosableStyle;
052: import com.vividsolutions.jump.workbench.ui.renderer.style.Style;
053:
054: public class DecorationStylePanel extends JPanel implements StylePanel {
055: private AddRemovePanel addRemovePanel = new AddRemovePanel(false);
056: private BorderLayout borderLayout1 = new BorderLayout();
057: private Layer layer;
058: private Collection choosableStyleClasses;
059:
060: public String getTitle() {
061: return I18N.get("ui.style.DecorationStylePanel.decorations");
062: }
063:
064: public DecorationStylePanel(Layer layer,
065: Collection choosableStyleClasses) {
066: try {
067: this .layer = layer;
068: this .choosableStyleClasses = choosableStyleClasses;
069: populateAddRemovePanel(layer, choosableStyleClasses);
070: setUpRenderer(((DefaultAddRemoveList) addRemovePanel
071: .getLeftList()).getList());
072: setUpRenderer(((DefaultAddRemoveList) addRemovePanel
073: .getRightList()).getList());
074: ((DefaultAddRemoveListModel) addRemovePanel.getLeftList()
075: .getModel()).setSorted(true);
076: ((DefaultAddRemoveListModel) addRemovePanel.getRightList()
077: .getModel()).setSorted(true);
078: jbInit();
079: } catch (Exception ex) {
080: ex.printStackTrace();
081: }
082: }
083:
084: private void setUpRenderer(JList list) {
085: list.setCellRenderer(new ListCellRenderer() {
086: private DefaultListCellRenderer baseRenderer = new DefaultListCellRenderer();
087:
088: public Component getListCellRendererComponent(JList list,
089: Object value, int index, boolean isSelected,
090: boolean cellHasFocus) {
091: ListItem item = (ListItem) value;
092: JLabel component = (JLabel) baseRenderer
093: .getListCellRendererComponent(list, value,
094: index, isSelected, cellHasFocus);
095: component.setText(item.style.getName());
096: component.setIcon(item.style.getIcon());
097:
098: return component;
099: }
100: });
101: }
102:
103: private void clearStyles(Layer layer) {
104: //Fundamental styles (BasicStyle, VertexStyle, LabelStyle) aren't among
105: //choosableStyleClasses and are in no danger of being cleared. [Jon Aquino]
106: for (Iterator i = choosableStyleClasses.iterator(); i.hasNext();) {
107: Class choosableStyleClass = (Class) i.next();
108: Style style = layer.getStyle(choosableStyleClass);
109:
110: if (style != null) {
111: layer.removeStyle(style);
112: }
113: }
114: }
115:
116: public void updateStyles() {
117: boolean firingEvents = layer.getLayerManager().isFiringEvents();
118: layer.getLayerManager().setFiringEvents(false);
119:
120: try {
121: clearStyles(layer);
122:
123: for (Iterator i = addRemovePanel.getRightItems().iterator(); i
124: .hasNext();) {
125: ListItem item = (ListItem) i.next();
126: layer.addStyle(item.style);
127: }
128: } finally {
129: layer.getLayerManager().setFiringEvents(firingEvents);
130: }
131:
132: layer.fireAppearanceChanged();
133: }
134:
135: void jbInit() throws Exception {
136: this .setLayout(borderLayout1);
137: addRemovePanel.setLeftText(I18N
138: .get("ui.style.DecorationStylePanel.available"));
139: addRemovePanel.setRightText(I18N
140: .get("ui.style.DecorationStylePanel.in-use"));
141: this .add(addRemovePanel, BorderLayout.CENTER);
142: }
143:
144: private void populateAddRemovePanel(Layer layer,
145: Collection choosableStyleClasses) {
146: ArrayList availableItems = new ArrayList();
147: ArrayList inUseItems = new ArrayList();
148:
149: for (Iterator i = choosableStyleClasses.iterator(); i.hasNext();) {
150: Class choosableStyleClass = (Class) i.next();
151: ChoosableStyle choosableStyleInUse = (ChoosableStyle) layer
152: .getStyle(choosableStyleClass);
153:
154: if (choosableStyleInUse != null) {
155: inUseItems.add(new ListItem(choosableStyleInUse));
156: } else {
157: try {
158: availableItems.add(new ListItem(
159: (ChoosableStyle) choosableStyleClass
160: .newInstance()));
161: } catch (IllegalAccessException e) {
162: Assert.shouldNeverReachHere();
163: } catch (InstantiationException e) {
164: Assert.shouldNeverReachHere();
165: }
166: }
167: }
168:
169: Collections.sort(availableItems);
170: Collections.sort(inUseItems);
171: addRemovePanel.getLeftList().getModel()
172: .setItems(availableItems);
173: addRemovePanel.getRightList().getModel().setItems(inUseItems);
174: }
175:
176: private class ListItem implements Comparable {
177: public ChoosableStyle style;
178:
179: public ListItem(ChoosableStyle style) {
180: this .style = style;
181: }
182:
183: public int compareTo(Object o) {
184: return toString().compareTo(o.toString());
185: }
186:
187: public String toString() {
188: return style.getName();
189: }
190: }
191:
192: public String validateInput() {
193: return null;
194: }
195: }
|