Revision 22954

View differences:

trunk/extensions/extSymbology/src/org/gvsig/symbology/gui/layerproperties/FeatureDependent.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.symbology.gui.layerproperties;
42

  
43
import java.awt.BorderLayout;
44
import java.awt.Component;
45
import java.awt.Dimension;
46
import java.awt.event.ActionEvent;
47
import java.awt.event.ActionListener;
48
import java.awt.event.MouseAdapter;
49
import java.awt.event.MouseEvent;
50
import java.beans.PropertyChangeEvent;
51

  
52
import javax.swing.AbstractCellEditor;
53
import javax.swing.JCheckBox;
54
import javax.swing.JComponent;
55
import javax.swing.JLabel;
56
import javax.swing.JOptionPane;
57
import javax.swing.JScrollPane;
58
import javax.swing.JTable;
59
import javax.swing.table.DefaultTableModel;
60
import javax.swing.table.TableCellEditor;
61
import javax.swing.table.TableCellRenderer;
62
import javax.swing.table.TableColumnModel;
63

  
64
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
65
import org.gvsig.gui.beans.swing.JBlank;
66
import org.gvsig.gui.beans.swing.JButton;
67
import org.gvsig.gui.beans.swing.celleditors.BooleanTableCellEditor;
68
import org.gvsig.gui.beans.swing.cellrenderers.BooleanTableCellRenderer;
69
import org.gvsig.symbology.fmap.labeling.FeatureDependentLabeled;
70
import org.gvsig.symbology.fmap.labeling.parse.LabelExpressionParser;
71

  
72
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
73
import com.iver.andami.PluginServices;
74
import com.iver.cit.gvsig.fmap.core.SymbologyFactory;
75
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
76
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.ILabelingMethod;
77
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.LabelClass;
78
import com.iver.cit.gvsig.gui.styling.SymbolEditor;
79

  
80
public class FeatureDependent extends AbstractLabelingMethodPanel implements ActionListener{
81
	private static final long serialVersionUID = 5493451803343695650L;
82
	private static final String[] classesTableFieldNames = new String[] {
83
		PluginServices.getText(LabelClassTableModel.class, "name"),
84
		PluginServices.getText(LabelClassTableModel.class, "preview"),
85
		PluginServices.getText(LabelClassTableModel.class, "filter"),
86
		PluginServices.getText(LabelClassTableModel.class, "label_expression"),
87
		PluginServices.getText(LabelClassTableModel.class, "visible"),
88
	};
89
	private static int NAME_FIELD_INDEX = 0;
90
	private static int PREVIEW_FIELD_INDEX = 1;
91
	private static int FILTER_FIELD_INDEX = 2;
92
	private static int LABEL_EXPRESSION_FIELD_INDEX = 3;
93
	private static int VISIBLE_FIELD_INDEX = 4;
94
	private JTable tblClasses = null;
95
	private JButton btnMoveUpClass;
96
	private JButton btnAddClass;
97
	private JCheckBox chkLabel;
98
	private JCheckBox chkDefinePriorities;
99
	private JScrollPane scrlPan;
100
	private boolean openEditor = false;
101
	private JButton btnMoveDownClass;
102
	private JButton btnDelClass;
103
	private String[] fieldNames;
104
	private int[] fieldTypes;
105

  
106
	private JCheckBox getChkDefinePriorities() {
107
		if (chkDefinePriorities == null) {
108
			chkDefinePriorities = new JCheckBox(PluginServices.getText(this, "label_priority"));
109
			chkDefinePriorities.addActionListener(this);
110
			chkDefinePriorities.setName("CHK_DEFINE_PRIORITIES");
111
		}
112
		return chkDefinePriorities;
113
	}
114

  
115

  
116
	private JButton getBtnDelClass() {
117
		if (btnDelClass == null) {
118
			btnDelClass = new JButton(PluginServices.getText(this, "delete"));
119
			btnDelClass.setName("BTNDELCLASS");
120
			btnDelClass.addActionListener(this);
121
		}
122
		return btnDelClass;
123
	}
124

  
125
	private JButton getBtnAddClass() {
126
		if (btnAddClass == null) {
127
			btnAddClass = new JButton(PluginServices.getText(this, "add"));
128
			btnAddClass.setName("BTNADDCLASS");
129
			btnAddClass.addActionListener(this);
130
		}
131
		return btnAddClass;
132
	}
133

  
134
	private JButton getBtnMoveUpClass() {
135
		if (btnMoveUpClass == null) {
136
			btnMoveUpClass = new JButton(PluginServices.getText(this, "move_up"));
137
			btnMoveUpClass.setName("BTNMOVEUPCLASS");
138
			btnMoveUpClass.addActionListener(this);
139
		}
140
		return btnMoveUpClass;
141
	}
142

  
143
	private JButton getBtnMoveDownClass() {
144
		if (btnMoveDownClass == null) {
145
			btnMoveDownClass = new JButton(PluginServices.getText(this, "move_down"));
146
			btnMoveDownClass.setName("BTNMOVEDOWNCLASS");
147
			btnMoveDownClass.addActionListener(this);
148
		}
149
		return btnMoveDownClass;
150
	}
151

  
152

  
153
	@Override
154
	protected void initializePanel() {
155
		setLayout(new BorderLayout(10, 10));
156
		add(new JScrollPane(getTblClasses()), BorderLayout.CENTER);
157

  
158
		GridBagLayoutPanel aux2 = new GridBagLayoutPanel();
159
		aux2.addComponent(getBtnAddClass());
160
		aux2.addComponent(getBtnDelClass());
161
		aux2.addComponent(new JBlank(10, 10));
162
		aux2.addComponent(getBtnMoveUpClass());
163
		aux2.addComponent(getBtnMoveDownClass());
164
		add(aux2, BorderLayout.EAST);
165
		add(getChkDefinePriorities(), BorderLayout.NORTH);
166
		add(getCenterScrl(), BorderLayout.CENTER);
167

  
168
	}
169

  
170

  
171
	private class LabelClassCellEditor extends AbstractCellEditor implements TableCellEditor {
172
		private static final long serialVersionUID = 6399823783851437400L;
173

  
174
		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
175
			if (openEditor) {
176
				LabelClass oldLc = (LabelClass) getTblClasses().getValueAt(row, PREVIEW_FIELD_INDEX);
177
				LabelClassProperties lcProp = new LabelClassProperties(fieldNames, fieldTypes);
178
				oldLc.setTexts(new String[] {oldLc.getName()});
179
				lcProp.setLabelClass(oldLc);
180
				PluginServices.getMDIManager()
181
				.addWindow(lcProp);
182
				LabelClass newLc = lcProp.getLabelClass();
183

  
184
				LabelClassTableModel m = (LabelClassTableModel) getTblClasses().getModel();
185

  
186
				if (!(oldLc.getName().equals(newLc.getName())))
187
					if(!checSameLablClassName(m,newLc.getName())){
188

  
189
						m.setValueAt(newLc.getLabelExpression(), row, LABEL_EXPRESSION_FIELD_INDEX);
190
						m.setValueAt(newLc.getName(), row, NAME_FIELD_INDEX);
191
						m.setValueAt(newLc, row, PREVIEW_FIELD_INDEX);
192
						m.setValueAt(newLc.getSQLQuery(), row, FILTER_FIELD_INDEX);
193
						m.setValueAt(newLc.isVisible(), row, VISIBLE_FIELD_INDEX);
194
						fireEditingStopped(); //Make the renderer reappear.
195

  
196
					}
197
					else JOptionPane.showMessageDialog(tblClasses, PluginServices.getText(this, "cannot_exist_two_label_classes_with_the_same_name")+"\n",PluginServices.getText(this,"error"),JOptionPane.ERROR_MESSAGE);
198
			}
199
			openEditor = false;
200
			return null;
201
		}
202

  
203
		public Object getCellEditorValue() {
204
			return null;
205
		}
206

  
207
	}
208

  
209
	private class LabelClassTableModel extends DefaultTableModel {
210
		private static final long serialVersionUID = -9152998982339430209L;
211

  
212
		public LabelClassTableModel(LabelClass[] labelClasses) {
213
			super();
214
			Object[][] values = new Object[labelClasses.length][classesTableFieldNames.length];
215
			for (int i = 0; i < values.length; i++) {
216
				values[i][PREVIEW_FIELD_INDEX] = labelClasses[i];
217
				values[i][NAME_FIELD_INDEX] = labelClasses[i].getName();
218
				values[i][FILTER_FIELD_INDEX] = labelClasses[i].getSQLQuery();
219
				values[i][LABEL_EXPRESSION_FIELD_INDEX] = labelClasses[i].getLabelExpression();
220
				values[i][VISIBLE_FIELD_INDEX] = labelClasses[i].isVisible();
221
			}
222
			setDataVector(values, classesTableFieldNames);
223
		}
224

  
225

  
226
		@Override
227
		public boolean isCellEditable(int row, int column) {
228
			return true;
229
		}
230

  
231
		public LabelClass getLabelAtRow(int row) {
232
			return (LabelClass) getValueAt(row, PREVIEW_FIELD_INDEX);
233
		}
234

  
235
		public LabelClass[] toLabelClassArray() {
236
			LabelClass[] classes = new LabelClass[getRowCount()];
237
			for (int i = 0; i < classes.length; i++) {
238
				classes[i] = getLabelAtRow(i);
239
				if (getChkDefinePriorities().isSelected()) {
240
					classes[i].setPriority(i);
241
				}
242
			}
243
			return classes;
244
		}
245
	}
246

  
247

  
248
	@Override
249
	public String getName() {
250
		return PluginServices.getText(
251
				this,
252
		"define_classes_of_features_and_label_each_differently")+".";
253
	}
254

  
255
	@Override
256
	public Class<? extends ILabelingMethod> getLabelingMethodClass() {
257
		return FeatureDependentLabeled.class;
258
	}
259

  
260
	@Override
261
	public void fillPanel(ILabelingMethod method, SelectableDataSource dataSource)
262
	throws ReadDriverException {
263
		fieldNames = dataSource.getFieldNames();
264
		fieldTypes = new int[fieldNames.length];
265
		for (int i = 0; i < fieldTypes.length; i++) {
266
			fieldTypes[i] = dataSource.getFieldType(i);
267
		}
268
		if (method == null) {
269
			this.method = new FeatureDependentLabeled();
270
		}
271
		refreshTable(method.getLabelClasses());
272
	}
273

  
274

  
275
	private void refreshTable(LabelClass[] classes) {
276
		getTblClasses().setModel(new LabelClassTableModel(classes));
277
		TableColumnModel cm = getTblClasses().getColumnModel();
278

  
279
		// the renderers
280
		cm.getColumn(PREVIEW_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
281

  
282
			public Component getTableCellRendererComponent(JTable table,
283
					Object value, boolean isSelected, boolean hasFocus,
284
					int row, int column) {
285
				LabelClassPreview lcPr = new LabelClassPreview();
286
				lcPr.setLabelClass((LabelClass) value);
287
				return lcPr;
288
			}
289

  
290
		});
291
		cm.getColumn(VISIBLE_FIELD_INDEX).setCellRenderer(new BooleanTableCellRenderer(false));
292
		cm.getColumn(LABEL_EXPRESSION_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
293
			public Component getTableCellRendererComponent(JTable table,
294
					Object value, boolean isSelected, boolean hasFocus,
295
					int row, int column) {
296
				String expr = null;
297
				if (value != null)
298
					expr = (String) value;
299
				if (expr == null)
300
					expr = LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR);
301

  
302
				expr = expr.replaceAll(LabelExpressionParser.tokenFor(LabelExpressionParser.EOFIELD), " | ");
303
				expr = expr.substring(0, expr.length()-1);
304
				return new JLabel("<html><p>"+expr+"</p></html>", JLabel.CENTER);
305
			}
306
		});
307

  
308
		// the editors
309
		for (int i = 0; i < cm.getColumnCount(); i++) {
310
			if (i!= VISIBLE_FIELD_INDEX) {
311
				cm.getColumn(i).setCellEditor(new LabelClassCellEditor());
312
			} else {
313
				cm.getColumn(VISIBLE_FIELD_INDEX).
314
				setCellEditor(new BooleanTableCellEditor(getTblClasses()));
315
			}
316
		}
317
	}
318

  
319
	private JScrollPane getCenterScrl() {
320
		if (scrlPan == null) {
321
			scrlPan = new JScrollPane();
322
			scrlPan.setViewportView(getTblClasses());
323
			scrlPan.setPreferredSize(new Dimension(180, 300));
324
		}
325
		return scrlPan;
326
	}
327

  
328

  
329

  
330
	private JTable getTblClasses() {
331
		if (tblClasses == null) {
332
			tblClasses = new JTable();
333
			tblClasses.setRowHeight(50);
334
			tblClasses.addMouseListener(new MouseAdapter() {
335
				int prevRow =-1;
336
				@Override
337
				public void mouseClicked(MouseEvent e) {
338
					int col = getTblClasses().getColumnModel().getColumnIndexAtX(e.getX());
339
					int row = (int) ((e.getY()-getTblClasses().getLocation().getY()) / getTblClasses().getRowHeight());
340
					if(!(row > getTblClasses().getRowCount()-1 || col > getTblClasses().getColumnCount()-1))
341
					{
342
						openEditor = (row == prevRow && e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2
343
						) ;
344
						prevRow = row;
345
						if (openEditor)
346
							getTblClasses().editCellAt(row, col);
347
					}
348
				}
349
			});
350
		}
351

  
352
		return tblClasses;
353
	}
354

  
355
	private void swapClass(int classIndex, int targetPos,int numOfElements) {
356
		LabelClass[] classes = ((LabelClassTableModel) getTblClasses().getModel()).toLabelClassArray();
357
		LabelClass aux = classes[targetPos];
358
		classes[targetPos] = classes[classIndex];
359
		classes[classIndex] = aux;
360
		refreshTable(classes);
361
	}
362

  
363
	public void actionPerformed(ActionEvent e) {
364
		if (method == null) return;
365

  
366

  
367
		JComponent c = (JComponent)e.getSource();
368
		if (c.equals(btnAddClass)) {
369

  
370
			LabelClass newClass = new LabelClass();
371
			String name = PluginServices.getText(this, "labeling")+
372
			String.valueOf(1);
373

  
374
			LabelClassTableModel mod = ((LabelClassTableModel) getTblClasses().getModel());
375

  
376
			int count = 0;
377
			while(checSameLablClassName(mod,name)){
378
				count++;
379
				name = PluginServices.getText(this, "labeling")+
380
				String.valueOf(count);
381
			}
382
			newClass.setName(name);
383
			mod.addRow(new Object[] {newClass.getName(), newClass, newClass.getSQLQuery(), newClass.getLabelExpression(), newClass.isVisible()});
384

  
385

  
386
		} else if (c.equals(btnDelClass)) {
387
			LabelClassTableModel mod = ((LabelClassTableModel) getTblClasses().getModel());
388
			if (mod.getRowCount()>=1) {
389
				int[] sRows = getTblClasses().getSelectedRows();
390

  
391
				for (int i = sRows.length-1; i >= 0 ; i--) {
392
					mod.removeRow(sRows[i]);
393
				}
394
			}
395
		} else if (c.equals(chkDefinePriorities)) {
396
		} else  if (c.equals(chkLabel)) {
397
			LabelClassTableModel mod = ((LabelClassTableModel) getTblClasses().getModel());
398
			int[] sRows = getTblClasses().getSelectedRows();
399
			for (int i = sRows.length-1; i >= 0 ; i--) {
400
				LabelClass lc = mod.getLabelAtRow(i);
401
				lc.setVisible(chkLabel.isSelected());
402
			}
403
		} else if (c.equals(btnMoveUpClass)) {
404
			int[] indices = getTblClasses().getSelectedRows();
405
			if (indices.length>0) {
406
				int classIndex = indices[0];
407
				int targetPos = Math.max(0, classIndex-1);
408
				swapClass(classIndex, targetPos,indices.length);
409
			}
410

  
411
		} else if (c.equals(btnMoveDownClass)) {
412
			int[] indices = getTblClasses().getSelectedRows();
413
			if (indices.length>0) {
414
				int classIndex = indices[indices.length-1];
415
				int targetPos = Math.min(getTblClasses().getRowCount()-1, classIndex+1);
416
				swapClass(classIndex, targetPos,indices.length);
417
			}
418

  
419
		}else if (c.equals(btnDelClass)) {
420
			int[] indices = getTblClasses().getSelectedRows();
421
			if (indices.length>0) {
422
				int classIndex = indices[0];
423
				int targetPos = Math.min(getTblClasses().getRowCount(), classIndex);
424
				swapClass(classIndex, targetPos,indices.length);
425
			}
426
		}
427
		method.setDefinesPriorities(chkDefinePriorities.isSelected());
428
		method.clearAllClasses();
429
		LabelClass[] classes = ((LabelClassTableModel) getTblClasses().getModel()).toLabelClassArray();
430
		for (int i = 0; i < classes.length; i++) {
431
			method.addLabelClass(classes[i]);
432
		}
433

  
434
	}
435

  
436
	private boolean checSameLablClassName(LabelClassTableModel mod, String name) {
437
		for (int i = 0; i < mod.getRowCount(); i++) {
438
			if(name.equals(mod.getLabelAtRow(i).getName()))
439
				return true;
440
		}
441
		return false;
442
	}
443

  
444

  
445
	public void propertyChange(PropertyChangeEvent evt) {
446
		// TODO Auto-generated method stub
447
//		throw new Error("Not yet implemented!");
448

  
449
	}
450
}
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.symbology.gui.layerproperties;
42

  
43
import java.awt.BorderLayout;
44
import java.awt.Component;
45
import java.awt.Dimension;
46
import java.awt.event.ActionEvent;
47
import java.awt.event.ActionListener;
48
import java.awt.event.MouseAdapter;
49
import java.awt.event.MouseEvent;
50
import java.beans.PropertyChangeEvent;
51

  
52
import javax.swing.AbstractCellEditor;
53
import javax.swing.JCheckBox;
54
import javax.swing.JComponent;
55
import javax.swing.JLabel;
56
import javax.swing.JOptionPane;
57
import javax.swing.JScrollPane;
58
import javax.swing.JTable;
59
import javax.swing.table.DefaultTableColumnModel;
60
import javax.swing.table.DefaultTableModel;
61
import javax.swing.table.TableCellEditor;
62
import javax.swing.table.TableCellRenderer;
63
import javax.swing.table.TableColumn;
64
import javax.swing.table.TableColumnModel;
65

  
66
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
67
import org.gvsig.gui.beans.swing.JBlank;
68
import org.gvsig.gui.beans.swing.JButton;
69
import org.gvsig.gui.beans.swing.celleditors.BooleanTableCellEditor;
70
import org.gvsig.gui.beans.swing.cellrenderers.BooleanTableCellRenderer;
71
import org.gvsig.symbology.fmap.labeling.FeatureDependentLabeled;
72
import org.gvsig.symbology.fmap.labeling.parse.LabelExpressionParser;
73

  
74
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
75
import com.iver.andami.PluginServices;
76
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
77
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.ILabelingMethod;
78
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.LabelClass;
79

  
80
public class FeatureDependent extends AbstractLabelingMethodPanel implements ActionListener{
81
	private static final long serialVersionUID = 5493451803343695650L;
82
	private static int NAME_FIELD_INDEX = 0;
83
	private static int PREVIEW_FIELD_INDEX = 1;
84
	private static int FILTER_FIELD_INDEX = 2;
85
	private static int LABEL_EXPRESSION_FIELD_INDEX = 3;
86
	private static int VISIBLE_FIELD_INDEX = 4;
87
	private JTable tblClasses = null;
88
	private JButton btnMoveUpClass;
89
	private JButton btnAddClass;
90
	private JCheckBox chkLabel;
91
	private JCheckBox chkDefinePriorities;
92
	private JScrollPane scrlPan;
93
	private boolean openEditor = false;
94
	private JButton btnMoveDownClass;
95
	private JButton btnDelClass;
96
	private String[] fieldNames;
97
	private int[] fieldTypes;
98

  
99
	private JCheckBox getChkDefinePriorities() {
100
		if (chkDefinePriorities == null) {
101
			chkDefinePriorities = new JCheckBox(PluginServices.getText(this, "label_priority"));
102
			chkDefinePriorities.addActionListener(this);
103
			chkDefinePriorities.setName("CHK_DEFINE_PRIORITIES");
104
		}
105
		return chkDefinePriorities;
106
	}
107

  
108

  
109
	private JButton getBtnDelClass() {
110
		if (btnDelClass == null) {
111
			btnDelClass = new JButton(PluginServices.getText(this, "delete"));
112
			btnDelClass.setName("BTNDELCLASS");
113
			btnDelClass.addActionListener(this);
114
		}
115
		return btnDelClass;
116
	}
117

  
118
	private JButton getBtnAddClass() {
119
		if (btnAddClass == null) {
120
			btnAddClass = new JButton(PluginServices.getText(this, "add"));
121
			btnAddClass.setName("BTNADDCLASS");
122
			btnAddClass.addActionListener(this);
123
		}
124
		return btnAddClass;
125
	}
126

  
127
	private JButton getBtnMoveUpClass() {
128
		if (btnMoveUpClass == null) {
129
			btnMoveUpClass = new JButton(PluginServices.getText(this, "move_up"));
130
			btnMoveUpClass.setName("BTNMOVEUPCLASS");
131
			btnMoveUpClass.addActionListener(this);
132
		}
133
		return btnMoveUpClass;
134
	}
135

  
136
	private JButton getBtnMoveDownClass() {
137
		if (btnMoveDownClass == null) {
138
			btnMoveDownClass = new JButton(PluginServices.getText(this, "move_down"));
139
			btnMoveDownClass.setName("BTNMOVEDOWNCLASS");
140
			btnMoveDownClass.addActionListener(this);
141
		}
142
		return btnMoveDownClass;
143
	}
144

  
145

  
146
	@Override
147
	protected void initializePanel() {
148

  
149
		setLayout(new BorderLayout(10, 10));
150

  
151
		GridBagLayoutPanel aux2 = new GridBagLayoutPanel();
152
		aux2.addComponent(getBtnAddClass());
153
		aux2.addComponent(getBtnDelClass());
154
		aux2.addComponent(new JBlank(10, 10));
155
		aux2.addComponent(getBtnMoveUpClass());
156
		aux2.addComponent(getBtnMoveDownClass());
157
		add(aux2, BorderLayout.EAST);
158
		add(getChkDefinePriorities(), BorderLayout.NORTH);
159
		add(getCenterScrl(), BorderLayout.CENTER);
160

  
161
	}
162

  
163

  
164
	private class LabelClassCellEditor extends AbstractCellEditor implements TableCellEditor {
165
		private static final long serialVersionUID = 6399823783851437400L;
166

  
167
		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
168
			if (openEditor) {
169
				LabelClass oldLc = (LabelClass) getTblClasses().getValueAt(row, PREVIEW_FIELD_INDEX);
170
				LabelClassProperties lcProp = new LabelClassProperties(fieldNames, fieldTypes);
171
				oldLc.setTexts(new String[] {oldLc.getName()});
172
				lcProp.setLabelClass(oldLc);
173
				PluginServices.getMDIManager()
174
				.addWindow(lcProp);
175
				LabelClass newLc = lcProp.getLabelClass();
176

  
177
				LabelClassTableModel m = (LabelClassTableModel) getTblClasses().getModel();
178

  
179
				if (!(oldLc.getName().equals(newLc.getName())))
180
					if(!checSameLablClassName(m,newLc.getName())){
181

  
182
						m.setValueAt(newLc.getLabelExpression(), row, LABEL_EXPRESSION_FIELD_INDEX);
183
						m.setValueAt(newLc.getName(), row, NAME_FIELD_INDEX);
184
						m.setValueAt(newLc, row, PREVIEW_FIELD_INDEX);
185
						m.setValueAt(newLc.getSQLQuery(), row, FILTER_FIELD_INDEX);
186
						m.setValueAt(newLc.isVisible(), row, VISIBLE_FIELD_INDEX);
187
						fireEditingStopped(); //Make the renderer reappear.
188

  
189
					}
190
					else JOptionPane.showMessageDialog(tblClasses, PluginServices.getText(this, "cannot_exist_two_label_classes_with_the_same_name")+"\n",PluginServices.getText(this,"error"),JOptionPane.ERROR_MESSAGE);
191
			}
192
			openEditor = false;
193
			return null;
194
		}
195

  
196
		public Object getCellEditorValue() {
197
			return null;
198
		}
199

  
200
	}
201

  
202
	private class LabelClassTableModel extends DefaultTableModel {
203
		private static final long serialVersionUID = -9152998982339430209L;
204

  
205

  
206

  
207
		private String[] classesTableFieldNames = new String[] {
208
				PluginServices.getText(this, "name"),
209
				PluginServices.getText(this, "preview"),
210
				PluginServices.getText(this, "filter"),
211
				PluginServices.getText(this, "label_expression"),
212
				PluginServices.getText(this, "visible"),
213
		};
214

  
215
		public LabelClassTableModel() {
216
			super();
217
			LabelClass[] labelClasses = method.getLabelClasses();
218

  
219
			Object[][] values = new Object[labelClasses.length][classesTableFieldNames.length];
220
			for (int i = 0; i < values.length; i++) {
221
				values[i][PREVIEW_FIELD_INDEX] = labelClasses[i];
222
				values[i][NAME_FIELD_INDEX] = labelClasses[i].getName();
223
				values[i][FILTER_FIELD_INDEX] = labelClasses[i].getSQLQuery();
224
				values[i][LABEL_EXPRESSION_FIELD_INDEX] = labelClasses[i].getLabelExpression();
225
				values[i][VISIBLE_FIELD_INDEX] = labelClasses[i].isVisible();
226
			}
227
			setDataVector(values, classesTableFieldNames);
228
		}
229

  
230
		public String getColumnName(int col) {
231
			return classesTableFieldNames[col];
232
		}
233

  
234
		@Override
235
		public boolean isCellEditable(int row, int column) {
236
			return true;
237
		}
238

  
239
		public LabelClass getLabelAtRow(int row) {
240
			return (LabelClass) getValueAt(row, PREVIEW_FIELD_INDEX);
241
		}
242

  
243
		public LabelClass[] toLabelClassArray() {
244
			LabelClass[] classes = new LabelClass[getRowCount()];
245
			for (int i = 0; i < classes.length; i++) {
246
				classes[i] = getLabelAtRow(i);
247
				if (getChkDefinePriorities().isSelected()) {
248
					classes[i].setPriority(i);
249
				}
250
			}
251
			return classes;
252
		}
253
	}
254

  
255

  
256
	@Override
257
	public String getName() {
258
		return PluginServices.getText(
259
				this,
260
		"define_classes_of_features_and_label_each_differently")+".";
261
	}
262

  
263
	@Override
264
	public Class<? extends ILabelingMethod> getLabelingMethodClass() {
265
		return FeatureDependentLabeled.class;
266
	}
267

  
268
	@Override
269
	public void fillPanel(ILabelingMethod method, SelectableDataSource dataSource)
270
	throws ReadDriverException {
271
		fieldNames = dataSource.getFieldNames();
272
		fieldTypes = new int[fieldNames.length];
273
		for (int i = 0; i < fieldTypes.length; i++) {
274
			fieldTypes[i] = dataSource.getFieldType(i);
275
		}
276
		if (method == null) {
277
			this.method = new FeatureDependentLabeled();
278
		}
279
//		getTblClasses().addColumn(new TableColumn());
280
//		scrlPan.setViewportView(getTblClasses());
281
		repaint();
282
	}
283

  
284
	private JScrollPane getCenterScrl() {
285
		if (scrlPan == null) {
286
			scrlPan = new JScrollPane(getTblClasses());
287
//			scrlPan.setViewportView(getTblClasses());
288
			scrlPan.setPreferredSize(new Dimension(180, 300));
289
		}
290
		return scrlPan;
291
	}
292

  
293

  
294

  
295
	private JTable getTblClasses() {
296
		if (tblClasses == null) {
297
			tblClasses = new JTable();
298
			tblClasses.setRowHeight(50);
299
			tblClasses.addMouseListener(new MouseAdapter() {
300
				int prevRow =-1;
301
				@Override
302
				public void mouseClicked(MouseEvent e) {
303
					int col = getTblClasses().getColumnModel().getColumnIndexAtX(e.getX());
304
					int row = (int) ((e.getY()-getTblClasses().getLocation().getY()) / getTblClasses().getRowHeight());
305
					if(!(row > getTblClasses().getRowCount()-1 || col > getTblClasses().getColumnCount()-1))
306
					{
307
						openEditor = (row == prevRow && e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2
308
						) ;
309
						prevRow = row;
310
						if (openEditor)
311
							getTblClasses().editCellAt(row, col);
312
					}
313
				}
314
			});
315

  
316
			tblClasses.setModel(new LabelClassTableModel());
317

  
318
			TableColumnModel cm = tblClasses.getColumnModel();
319

  
320
			tblClasses.getColumnModel().getColumn(PREVIEW_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
321

  
322
				public Component getTableCellRendererComponent(JTable table,
323
						Object value, boolean isSelected, boolean hasFocus,
324
						int row, int column) {
325
					LabelClassPreview lcPr = new LabelClassPreview();
326
					lcPr.setLabelClass((LabelClass) value);
327
					return lcPr;
328
				}
329

  
330
			});
331
			tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).setCellRenderer(new BooleanTableCellRenderer(false));
332
			tblClasses.getColumnModel().getColumn(LABEL_EXPRESSION_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
333
				public Component getTableCellRendererComponent(JTable table,
334
						Object value, boolean isSelected, boolean hasFocus,
335
						int row, int column) {
336
					String expr = null;
337
					if (value != null)
338
						expr = (String) value;
339
					if (expr == null)
340
						expr = LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR);
341

  
342
					expr = expr.replaceAll(LabelExpressionParser.tokenFor(LabelExpressionParser.EOFIELD), " | ");
343
					expr = expr.substring(0, expr.length()-1);
344
					return new JLabel("<html><p>"+expr+"</p></html>", JLabel.CENTER);
345
				}
346
			});
347

  
348
			// the editors
349
			for (int i = 0; i < tblClasses.getColumnModel().getColumnCount(); i++) {
350
				if (i!= VISIBLE_FIELD_INDEX) {
351
					tblClasses.getColumnModel().getColumn(i).setCellEditor(new LabelClassCellEditor());
352
				} else {
353
					tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).
354
					setCellEditor(new BooleanTableCellEditor(tblClasses));
355
				}
356
			}
357
			((DefaultTableModel)tblClasses.getModel()).fireTableDataChanged();
358

  
359
		}
360
		return tblClasses;
361
	}
362

  
363
	private void swapClass(int classIndex, int targetPos,int numOfElements) {
364
		LabelClass[] classes = ((LabelClassTableModel) getTblClasses().getModel()).toLabelClassArray();
365
		LabelClass aux = classes[targetPos];
366
		classes[targetPos] = classes[classIndex];
367
		classes[classIndex] = aux;
368
	}
369

  
370
	public void actionPerformed(ActionEvent e) {
371
		if (method == null) return;
372

  
373

  
374
		JComponent c = (JComponent)e.getSource();
375
		if (c.equals(btnAddClass)) {
376

  
377
			LabelClass newClass = new LabelClass();
378
			String name = PluginServices.getText(this, "labeling")+
379
			String.valueOf(1);
380

  
381
			LabelClassTableModel mod = ((LabelClassTableModel) getTblClasses().getModel());
382

  
383
			int count = 0;
384
			while(checSameLablClassName(mod,name)){
385
				count++;
386
				name = PluginServices.getText(this, "labeling")+
387
				String.valueOf(count);
388
			}
389
			newClass.setName(name);
390
			mod.addRow(new Object[] {newClass.getName(), newClass, newClass.getSQLQuery(), newClass.getLabelExpression(), newClass.isVisible()});
391
//			tblClasses.setModel(mod);
392

  
393
		} else if (c.equals(btnDelClass)) {
394
			LabelClassTableModel mod = ((LabelClassTableModel) getTblClasses().getModel());
395
			if (mod.getRowCount()>=1) {
396
				int[] sRows = getTblClasses().getSelectedRows();
397

  
398
				for (int i = sRows.length-1; i >= 0 ; i--) {
399
					mod.removeRow(sRows[i]);
400
				}
401
			}
402
		} else if (c.equals(chkDefinePriorities)) {
403
		} else  if (c.equals(chkLabel)) {
404
			LabelClassTableModel mod = ((LabelClassTableModel) getTblClasses().getModel());
405
			int[] sRows = getTblClasses().getSelectedRows();
406
			for (int i = sRows.length-1; i >= 0 ; i--) {
407
				LabelClass lc = mod.getLabelAtRow(i);
408
				lc.setVisible(chkLabel.isSelected());
409
			}
410
		} else if (c.equals(btnMoveUpClass)) {
411
			int[] indices = getTblClasses().getSelectedRows();
412
			if (indices.length>0) {
413
				int classIndex = indices[0];
414
				int targetPos = Math.max(0, classIndex-1);
415
				swapClass(classIndex, targetPos,indices.length);
416
			}
417

  
418
		} else if (c.equals(btnMoveDownClass)) {
419
			int[] indices = getTblClasses().getSelectedRows();
420
			if (indices.length>0) {
421
				int classIndex = indices[indices.length-1];
422
				int targetPos = Math.min(getTblClasses().getRowCount()-1, classIndex+1);
423
				swapClass(classIndex, targetPos,indices.length);
424
			}
425

  
426
		}else if (c.equals(btnDelClass)) {
427
			int[] indices = getTblClasses().getSelectedRows();
428
			if (indices.length>0) {
429
				int classIndex = indices[0];
430
				int targetPos = Math.min(getTblClasses().getRowCount(), classIndex);
431
				swapClass(classIndex, targetPos,indices.length);
432
			}
433
		}
434
		method.setDefinesPriorities(chkDefinePriorities.isSelected());
435
		method.clearAllClasses();
436
		LabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
437
		for (int i = 0; i < classes.length; i++) {
438
			method.addLabelClass(classes[i]);
439
		}
440

  
441
	}
442

  
443
	private boolean checSameLablClassName(LabelClassTableModel mod, String name) {
444
		for (int i = 0; i < mod.getRowCount(); i++) {
445
			if(name.equals(mod.getLabelAtRow(i).getName()))
446
				return true;
447
		}
448
		return false;
449
	}
450

  
451

  
452
	public void propertyChange(PropertyChangeEvent evt) {
453
		// TODO Auto-generated method stub
454
//		throw new Error("Not yet implemented!");
455

  
456
	}
457
}

Also available in: Unified diff