Statistics
| Revision:

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
}