root / org.gvsig.complexlegend / trunk / org.gvsig.complexlegend / org.gvsig.complexlegend.swing / org.gvsig.complexlegend.swing.impl / src / main / java / org / gvsig / complexlegend / swing / impl / DefaultComplexLegendPanelController.java @ 3574
History | View | Annotate | Download (10.8 KB)
1 |
/*
|
---|---|
2 |
* To change this license header, choose License Headers in Project Properties.
|
3 |
* To change this template file, choose Tools | Templates
|
4 |
* and open the template in the editor.
|
5 |
*/
|
6 |
package org.gvsig.complexlegend.swing.impl; |
7 |
|
8 |
import com.jgoodies.forms.layout.CellConstraints; |
9 |
import java.awt.Dimension; |
10 |
import java.awt.event.ActionEvent; |
11 |
import java.util.Iterator; |
12 |
import java.util.List; |
13 |
import javax.swing.DefaultComboBoxModel; |
14 |
import javax.swing.ImageIcon; |
15 |
import javax.swing.JDialog; |
16 |
import javax.swing.JPanel; |
17 |
import javax.swing.event.ListDataEvent; |
18 |
import javax.swing.event.ListDataListener; |
19 |
import org.gvsig.andami.IconThemeHelper; |
20 |
import org.gvsig.andami.PluginServices; |
21 |
import org.gvsig.app.project.documents.view.legend.gui.AbstractParentPanel; |
22 |
import org.gvsig.app.project.documents.view.legend.gui.Features; |
23 |
import org.gvsig.app.project.documents.view.legend.gui.ILegendPanel; |
24 |
import org.gvsig.complexlegend.ComplexLegendItem; |
25 |
import org.gvsig.complexlegend.VectorComplexLegend; |
26 |
import org.gvsig.complexlegend.impl.DefaultVectorComplexLegend; |
27 |
import org.gvsig.complexlegend.swing.ComplexLegendPanel; |
28 |
import org.gvsig.fmap.mapcontext.MapContextLocator; |
29 |
import org.gvsig.fmap.mapcontext.layers.FLayer; |
30 |
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; |
31 |
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend; |
32 |
import org.gvsig.symbology.swing.SymbologySwingLocator; |
33 |
import org.gvsig.tools.ToolsLocator; |
34 |
import org.gvsig.tools.i18n.I18nManager; |
35 |
import org.gvsig.tools.observer.Observable; |
36 |
import org.gvsig.tools.observer.Observer; |
37 |
import org.slf4j.Logger; |
38 |
import org.slf4j.LoggerFactory; |
39 |
|
40 |
/**
|
41 |
*
|
42 |
* @author pako
|
43 |
*/
|
44 |
@SuppressWarnings("UseSpecificCatch") |
45 |
public class DefaultComplexLegendPanelController extends DefaultComplexLegendPanelView implements ComplexLegendPanel, Observer { |
46 |
|
47 |
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultComplexLegendPanelController.class); |
48 |
private VectorComplexLegend auxLegend;
|
49 |
private FLayer layer;
|
50 |
private DefaultComboBoxModel model; |
51 |
private ILegendPanel legendPanel;
|
52 |
private JDialog dlg; |
53 |
private ComplexLegendItem currentItem;
|
54 |
|
55 |
public DefaultComplexLegendPanelController() {
|
56 |
translate(); |
57 |
initializeComponents(); |
58 |
} |
59 |
|
60 |
private void translate() { |
61 |
|
62 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
63 |
|
64 |
chkAllowOverlap.setText(i18nManager.getTranslation(chkAllowOverlap.getText())); |
65 |
legendPanelTitle.setText(i18nManager.getTranslation(legendPanelTitle.getText())); |
66 |
symbolPanelTitle.setText(i18nManager.getTranslation(symbolPanelTitle.getText())); |
67 |
|
68 |
addButton.setToolTipText(i18nManager.getTranslation(addButton.getToolTipText())); |
69 |
removeButton.setToolTipText(i18nManager.getTranslation(removeButton.getToolTipText())); |
70 |
|
71 |
} |
72 |
|
73 |
private void initializeComponents() { |
74 |
|
75 |
addButton.setIcon(PluginServices.getIconTheme().get("legend-add"));
|
76 |
addButton.addActionListener((ActionEvent arg0) -> {
|
77 |
createComplexLegendItemWindow(); |
78 |
}); |
79 |
|
80 |
removeButton.setIcon(PluginServices.getIconTheme().get("legend-delete"));
|
81 |
removeButton.addActionListener((ActionEvent arg0) -> {
|
82 |
removeComplexLegendItem(); |
83 |
}); |
84 |
|
85 |
cmbValue.setModel(getComboBoxModel()); |
86 |
cmbValue.setPreferredSize(new Dimension(350, 20)); |
87 |
cmbValue.addActionListener((ActionEvent e) -> {
|
88 |
refreshLegendPanel(); |
89 |
}); |
90 |
|
91 |
} |
92 |
|
93 |
private DefaultComboBoxModel getComboBoxModel() { |
94 |
if (this.model == null) { |
95 |
this.model = new DefaultComboBoxModel(); |
96 |
this.model.addListDataListener(new ListDataListener() { |
97 |
@Override
|
98 |
public void intervalRemoved(ListDataEvent arg0) { |
99 |
} |
100 |
|
101 |
@Override
|
102 |
public void intervalAdded(ListDataEvent arg0) { |
103 |
} |
104 |
|
105 |
@Override
|
106 |
public void contentsChanged(ListDataEvent arg0) { |
107 |
refreshButtons(); |
108 |
} |
109 |
}); |
110 |
} |
111 |
return this.model; |
112 |
} |
113 |
|
114 |
protected void refreshButtons() { |
115 |
boolean status = (getComboBoxModel().getSize() != 0); |
116 |
cmbValue.setEnabled(status); |
117 |
removeButton.setEnabled(status); |
118 |
if (legendPanel != null) { |
119 |
legendPanel.getPanel().setVisible(status); |
120 |
} |
121 |
if (auxLegend != null && auxLegend instanceof DefaultVectorComplexLegend) { |
122 |
chkAllowOverlap.setSelected(auxLegend.getAllowOverlap()); |
123 |
} |
124 |
} |
125 |
|
126 |
|
127 |
|
128 |
protected void createComplexLegendItemWindow() { |
129 |
|
130 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
131 |
|
132 |
if (layer != null) { |
133 |
ComplexLegendItemPanel legendItemPanel |
134 |
= new ComplexLegendItemPanel(layer, (VectorComplexLegend) getLegend());
|
135 |
legendItemPanel.addObserver(this);
|
136 |
|
137 |
dlg = new JDialog(); |
138 |
dlg.setTitle(i18nManager.getTranslation("SelectItem"));
|
139 |
dlg.setResizable(true);
|
140 |
|
141 |
dlg.getContentPane().add(legendItemPanel); |
142 |
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
143 |
|
144 |
dlg.setSize(510, 510); |
145 |
dlg.setModal(true);
|
146 |
dlg.pack(); |
147 |
dlg.setLocationRelativeTo(null);
|
148 |
dlg.setVisible(true);
|
149 |
} |
150 |
} |
151 |
|
152 |
@Override
|
153 |
public String getDescription() { |
154 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
155 |
return i18nManager.getTranslation(
|
156 |
"legend_by_scale");
|
157 |
} |
158 |
|
159 |
@Override
|
160 |
public ImageIcon getIcon() { |
161 |
return IconThemeHelper.getImageIcon(
|
162 |
"scaled-symbols");
|
163 |
} |
164 |
|
165 |
@Override
|
166 |
public ILegend getLegend() {
|
167 |
if (auxLegend == null) { |
168 |
auxLegend = (VectorComplexLegend) MapContextLocator.getMapContextManager() |
169 |
.createLegend(DefaultVectorComplexLegend.COMPLEX_LEGEND_NAME); |
170 |
} |
171 |
saveCurrentPanel(); |
172 |
auxLegend.setAllowOverlap(this.chkAllowOverlap.isSelected());
|
173 |
|
174 |
return (VectorComplexLegend) auxLegend.cloneLegend();
|
175 |
} |
176 |
|
177 |
@Override
|
178 |
public Class getLegendClass() { |
179 |
return DefaultVectorComplexLegend.class;
|
180 |
} |
181 |
|
182 |
@Override
|
183 |
public JPanel getPanel() { |
184 |
return this; |
185 |
} |
186 |
|
187 |
@Override
|
188 |
public Class getParentClass() { |
189 |
return Features.class;
|
190 |
} |
191 |
|
192 |
@Override
|
193 |
public String getTitle() { |
194 |
I18nManager i18nManager = ToolsLocator.getI18nManager(); |
195 |
return i18nManager.getTranslation("complex_symbology"); |
196 |
} |
197 |
|
198 |
@Override
|
199 |
public boolean isSuitableFor(FLayer layer) { |
200 |
return (layer instanceof FLyrVect); |
201 |
} |
202 |
|
203 |
@Override
|
204 |
public void setData(FLayer layer, ILegend data) { |
205 |
this.layer = layer;
|
206 |
if (data instanceof DefaultVectorComplexLegend) { |
207 |
auxLegend = (DefaultVectorComplexLegend) data.cloneLegend(); |
208 |
updateComboModel(); |
209 |
chkAllowOverlap.setSelected(auxLegend.getAllowOverlap()); |
210 |
} |
211 |
|
212 |
} |
213 |
|
214 |
private void saveCurrentPanel() { |
215 |
if (legendPanel != null && currentItem != null) { |
216 |
currentItem.setLegend(legendPanel.getLegend()); |
217 |
} |
218 |
} |
219 |
|
220 |
|
221 |
public void refreshLegendPanel() { |
222 |
ComplexLegendItem item = (ComplexLegendItem) cmbValue.getSelectedItem(); |
223 |
if (item != null) { |
224 |
ILegendPanel aux = getLegendPanel(item.getLegend()); |
225 |
if (aux != null) { |
226 |
saveCurrentPanel(); |
227 |
|
228 |
symbolPanel.removeAll(); |
229 |
legendPanel = aux; |
230 |
legendPanel.setData(layer, item.getLegend()); |
231 |
|
232 |
CellConstraints cc = new CellConstraints();
|
233 |
|
234 |
symbolPanel.add(legendPanel.getPanel(),cc.xy(1,1)); |
235 |
symbolPanel.repaint(); |
236 |
symbolPanel.revalidate(); |
237 |
|
238 |
currentItem = item; |
239 |
} |
240 |
} |
241 |
} |
242 |
|
243 |
@SuppressWarnings("null") |
244 |
private ILegendPanel getLegendPanel(ILegend legend) {
|
245 |
List panels = SymbologySwingLocator.getSwingManager().getLegendEditorClasses();
|
246 |
Iterator it = panels.iterator();
|
247 |
while (it.hasNext()) {
|
248 |
Class panelClass = (Class) it.next(); |
249 |
ILegendPanel panel; |
250 |
try {
|
251 |
panel = (ILegendPanel) panelClass.newInstance(); |
252 |
if (!(panel instanceof AbstractParentPanel)) { |
253 |
if (panel.getLegendClass().equals(legend.getClass())) {
|
254 |
panel.setData(layer, legend); |
255 |
return panel;
|
256 |
} |
257 |
} |
258 |
} catch (Exception e) { |
259 |
LOGGER.warn("Error creating ILegendPanel. ", e);
|
260 |
return null; |
261 |
} |
262 |
} |
263 |
return null; |
264 |
} |
265 |
|
266 |
protected void removeComplexLegendItem() { |
267 |
ComplexLegendItem item = (ComplexLegendItem) cmbValue.getSelectedItem(); |
268 |
int index = auxLegend.getLegends().indexOf(item);
|
269 |
if (index != -1) { |
270 |
auxLegend.remove(item); |
271 |
getComboBoxModel().removeElementAt(index); |
272 |
} |
273 |
refreshButtons(); |
274 |
} |
275 |
|
276 |
@Override
|
277 |
public void update(Observable observable, Object isAccepted) { |
278 |
if (observable instanceof ComplexLegendItemPanel && isAccepted instanceof Boolean) { |
279 |
ComplexLegendItemPanel itemPanel = (ComplexLegendItemPanel) observable; |
280 |
boolean acceptForm = (Boolean) isAccepted; |
281 |
if (!acceptForm) {
|
282 |
/* Si se ha pinchado en cancelar, se cierra sin m?s */
|
283 |
dlg.dispose(); |
284 |
} else {
|
285 |
if (itemPanel.validateValues()) {
|
286 |
ComplexLegendItem item = itemPanel.getLegendItem(); |
287 |
|
288 |
/* Guardo el panel actual*/
|
289 |
saveCurrentPanel(); |
290 |
|
291 |
/* A?ado y ordeno la nueva entrada */
|
292 |
auxLegend.add(item); |
293 |
updateComboModel(); |
294 |
|
295 |
/* Cargo el nuevo panel */
|
296 |
symbolPanel.removeAll(); |
297 |
legendPanel = itemPanel.getLegendPanel(); |
298 |
legendPanel.setData(layer, item.getLegend()); |
299 |
|
300 |
CellConstraints cc = new CellConstraints();
|
301 |
symbolPanel.add(legendPanel.getPanel(),cc.xy(1,1)); |
302 |
symbolPanel.repaint(); |
303 |
|
304 |
/* Selecciono la nueva entrada */
|
305 |
currentItem = item; |
306 |
cmbValue.setSelectedItem(item); |
307 |
|
308 |
/* Cierro el di?logo */
|
309 |
dlg.dispose(); |
310 |
} |
311 |
} |
312 |
} |
313 |
} |
314 |
|
315 |
private void updateComboModel() { |
316 |
getComboBoxModel().removeAllElements(); |
317 |
if (auxLegend != null) { |
318 |
Iterator<ComplexLegendItem> it = auxLegend.getLegends().iterator();
|
319 |
while (it.hasNext()) {
|
320 |
ComplexLegendItem item = (ComplexLegendItem) it.next(); |
321 |
getComboBoxModel().addElement(item); |
322 |
} |
323 |
|
324 |
} |
325 |
} |
326 |
|
327 |
|
328 |
} |