Revision 23118

View differences:

trunk/extensions/extSymbology/src/org/gvsig/symbology/gui/layerproperties/FeatureDependent.java
43 43
import java.awt.BorderLayout;
44 44
import java.awt.Component;
45 45
import java.awt.Dimension;
46
import java.awt.List;
46 47
import java.awt.event.ActionEvent;
47 48
import java.awt.event.ActionListener;
48 49
import java.awt.event.MouseAdapter;
......
54 55
import javax.swing.JComponent;
55 56
import javax.swing.JLabel;
56 57
import javax.swing.JOptionPane;
58
import javax.swing.JPanel;
57 59
import javax.swing.JScrollPane;
58 60
import javax.swing.JTable;
59
import javax.swing.table.DefaultTableColumnModel;
61
import javax.swing.ListSelectionModel;
60 62
import javax.swing.table.DefaultTableModel;
61 63
import javax.swing.table.TableCellEditor;
62 64
import javax.swing.table.TableCellRenderer;
63
import javax.swing.table.TableColumn;
64 65
import javax.swing.table.TableColumnModel;
65 66

  
66 67
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
......
84 85
	private static int FILTER_FIELD_INDEX = 2;
85 86
	private static int LABEL_EXPRESSION_FIELD_INDEX = 3;
86 87
	private static int VISIBLE_FIELD_INDEX = 4;
87
	private JTable tblClasses = null;
88
	JTable tblClasses = null;
88 89
	private JButton btnMoveUpClass;
89 90
	private JButton btnAddClass;
90 91
	private JCheckBox chkLabel;
......
95 96
	private JButton btnDelClass;
96 97
	private String[] fieldNames;
97 98
	private int[] fieldTypes;
99
	private GridBagLayoutPanel buttonPanel;
98 100

  
101
	@Override
102
	public String getName() {
103
		return PluginServices.getText(
104
				this,
105
		"define_classes_of_features_and_label_each_differently")+".";
106
	}
107

  
108
	@Override
109
	public Class<? extends ILabelingMethod> getLabelingMethodClass() {
110
		return FeatureDependentLabeled.class;
111
	}
112

  
113

  
99 114
	private JCheckBox getChkDefinePriorities() {
100 115
		if (chkDefinePriorities == null) {
101 116
			chkDefinePriorities = new JCheckBox(PluginServices.getText(this, "label_priority"));
......
142 157
		return btnMoveDownClass;
143 158
	}
144 159

  
160
	private JScrollPane getCenterScrl() {
145 161

  
146
	@Override
147
	protected void initializePanel() {
162
		scrlPan = new JScrollPane(getTblClasses());
163
		scrlPan.setPreferredSize(new Dimension(180, 300));
148 164

  
149
		setLayout(new BorderLayout(10, 10));
165
		return scrlPan;
166
	}
150 167

  
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 168

  
169
	private JTable getTblClasses() {
170

  
171
		tblClasses = new JTable(new LabelClassTableModel());
172
		tblClasses.setRowHeight(50);
173
		tblClasses.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
174
		tblClasses.addMouseListener(new MouseAdapter() {
175
			int prevRow =-1;
176
			@Override
177
			public void mouseClicked(MouseEvent e) {
178
				int col = tblClasses.getColumnModel().getColumnIndexAtX(e.getX());
179
				int row = (int) ((e.getY()-tblClasses.getLocation().getY()) / tblClasses.getRowHeight());
180
				if(!(row > tblClasses.getRowCount()-1 || col > tblClasses.getColumnCount()-1))
181
				{
182
					openEditor = (row == prevRow && e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2
183
					) ;
184
					prevRow = row;
185
					if (openEditor)
186
						tblClasses.editCellAt(row, col);
187
				}
188
			}
189
		});
190

  
191
		TableColumnModel cm = tblClasses.getColumnModel();
192

  
193
		tblClasses.getColumnModel().getColumn(PREVIEW_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
194

  
195
			public Component getTableCellRendererComponent(JTable table,
196
					Object value, boolean isSelected, boolean hasFocus,
197
					int row, int column) {
198
				LabelClassPreview lcPr = new LabelClassPreview();
199
				lcPr.setLabelClass((LabelClass) value);
200
				return lcPr;
201
			}
202

  
203
		});
204
		tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).setCellRenderer(new BooleanTableCellRenderer(false));
205
		tblClasses.getColumnModel().getColumn(LABEL_EXPRESSION_FIELD_INDEX).setCellRenderer(new TableCellRenderer() {
206
			public Component getTableCellRendererComponent(JTable table,
207
					Object value, boolean isSelected, boolean hasFocus,
208
					int row, int column) {
209
				String expr = null;
210
				if (value != null)
211
					expr = (String) value;
212
				if (expr == null)
213
					expr = LabelExpressionParser.tokenFor(LabelExpressionParser.EOEXPR);
214

  
215
				expr = expr.replaceAll(LabelExpressionParser.tokenFor(LabelExpressionParser.EOFIELD), " | ");
216
				expr = expr.substring(0, expr.length()-1);
217
				return new JLabel("<html><p>"+expr+"</p></html>", JLabel.CENTER);
218
			}
219
		});
220

  
221
		// the editors
222
		for (int i = 0; i < tblClasses.getColumnModel().getColumnCount(); i++) {
223
			if (i!= VISIBLE_FIELD_INDEX) {
224
				tblClasses.getColumnModel().getColumn(i).setCellEditor(new LabelClassCellEditor());
225
			} else {
226
				tblClasses.getColumnModel().getColumn(VISIBLE_FIELD_INDEX).
227
				setCellEditor(new BooleanTableCellEditor(tblClasses));
228
			}
229
		}
230
		((DefaultTableModel)tblClasses.getModel()).fireTableDataChanged();
231
		repaint();
232

  
233
		return tblClasses;
161 234
	}
162 235

  
163 236

  
......
166 239

  
167 240
		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
168 241
			if (openEditor) {
169
				LabelClass oldLc = (LabelClass) getTblClasses().getValueAt(row, PREVIEW_FIELD_INDEX);
242
				LabelClass oldLc = (LabelClass) tblClasses.getValueAt(row, PREVIEW_FIELD_INDEX);
170 243
				LabelClassProperties lcProp = new LabelClassProperties(fieldNames, fieldTypes);
171 244
				oldLc.setTexts(new String[] {oldLc.getName()});
172 245
				lcProp.setLabelClass(oldLc);
......
174 247
				.addWindow(lcProp);
175 248
				LabelClass newLc = lcProp.getLabelClass();
176 249

  
177
				LabelClassTableModel m = (LabelClassTableModel) getTblClasses().getModel();
250
				LabelClassTableModel m = (LabelClassTableModel) tblClasses.getModel();
251
				Boolean changeDone = false;
178 252

  
179 253
				if (!(oldLc.getName().equals(newLc.getName())))
180 254
					if(!checSameLablClassName(m,newLc.getName())){
......
185 259
						m.setValueAt(newLc.getSQLQuery(), row, FILTER_FIELD_INDEX);
186 260
						m.setValueAt(newLc.isVisible(), row, VISIBLE_FIELD_INDEX);
187 261
						fireEditingStopped(); //Make the renderer reappear.
188

  
262
						changeDone = true;
189 263
					}
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);
264
					else {
265
						JOptionPane.showMessageDialog(tblClasses, PluginServices.getText(this, "cannot_exist_two_label_classes_with_the_same_name")+"\n",PluginServices.getText(this,"error"),JOptionPane.ERROR_MESSAGE);
266
						changeDone = true;
267
					}
268
				if (!changeDone){
269
					m.setValueAt(newLc.getLabelExpression(), row, LABEL_EXPRESSION_FIELD_INDEX);
270
					m.setValueAt(newLc.getName(), row, NAME_FIELD_INDEX);
271
					m.setValueAt(newLc, row, PREVIEW_FIELD_INDEX);
272
					m.setValueAt(newLc.getSQLQuery(), row, FILTER_FIELD_INDEX);
273
					m.setValueAt(newLc.isVisible(), row, VISIBLE_FIELD_INDEX);
274
					fireEditingStopped(); //Make the renderer reappear.
275
					changeDone = true;
276
				}
191 277
			}
192 278
			openEditor = false;
193 279
			return null;
......
199 285

  
200 286
	}
201 287

  
288

  
289
	private boolean checSameLablClassName(LabelClassTableModel mod, String name) {
290
		for (int i = 0; i < mod.getRowCount(); i++) {
291
			if(name.equals(mod.getLabelAtRow(i).getName()))
292
				return true;
293
		}
294
		return false;
295
	}
296

  
297

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

  
205

  
206

  
207 301
		private String[] classesTableFieldNames = new String[] {
208 302
				PluginServices.getText(this, "name"),
209 303
				PluginServices.getText(this, "preview"),
......
212 306
				PluginServices.getText(this, "visible"),
213 307
		};
214 308

  
309

  
215 310
		public LabelClassTableModel() {
216 311
			super();
217 312
			LabelClass[] labelClasses = method.getLabelClasses();
......
231 326
			return classesTableFieldNames[col];
232 327
		}
233 328

  
329
		public int getColumnCount() {
330
			return classesTableFieldNames.length;
331
		}
332

  
234 333
		@Override
235 334
		public boolean isCellEditable(int row, int column) {
236 335
			return true;
......
250 349
			}
251 350
			return classes;
252 351
		}
253
	}
254 352

  
353
		public void setClassArray(LabelClass[] classes) {
354
			for (int i = 0; i < classes.length; i++) {
355
					setValueAt(classes[i],i,PREVIEW_FIELD_INDEX);
356
					setValueAt(classes[i].getName(),i,NAME_FIELD_INDEX);
357
					setValueAt(classes[i].getSQLQuery(),i,FILTER_FIELD_INDEX);
358
					setValueAt(classes[i].getLabelExpression(),i,LABEL_EXPRESSION_FIELD_INDEX);
359
					setValueAt(classes[i].isVisible(),i,VISIBLE_FIELD_INDEX);
360
			}
255 361

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

  
263 365
	@Override
264
	public Class<? extends ILabelingMethod> getLabelingMethodClass() {
265
		return FeatureDependentLabeled.class;
366
	protected void initializePanel() {
367

  
368
		setLayout(new BorderLayout());
369
		JPanel panel = new JPanel(new BorderLayout());
370
		buttonPanel = new GridBagLayoutPanel();
371
		buttonPanel.addComponent(getBtnAddClass());
372
		buttonPanel.addComponent(getBtnDelClass());
373
		buttonPanel.addComponent(new JBlank(10, 10));
374
		buttonPanel.addComponent(getBtnMoveUpClass());
375
		buttonPanel.addComponent(getBtnMoveDownClass());
376
		panel.add(buttonPanel, BorderLayout.EAST);
377
		panel.add(getChkDefinePriorities(), BorderLayout.NORTH);
378
		panel.add(getCenterScrl(), BorderLayout.CENTER);
379
		add(panel,BorderLayout.CENTER);
380

  
266 381
	}
267 382

  
383

  
268 384
	@Override
269 385
	public void fillPanel(ILabelingMethod method, SelectableDataSource dataSource)
270 386
	throws ReadDriverException {
......
276 392
		if (method == null) {
277 393
			this.method = new FeatureDependentLabeled();
278 394
		}
279
//		getTblClasses().addColumn(new TableColumn());
280
//		scrlPan.setViewportView(getTblClasses());
395
		chkDefinePriorities.setSelected(this.method.definesPriorities());
281 396
		repaint();
282 397
	}
283 398

  
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
	}
399
	private void swapClass(int classIndex, int targetPos,int numOfElements) {
292 400

  
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();
401
		LabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
365 402
		LabelClass aux = classes[targetPos];
366 403
		classes[targetPos] = classes[classIndex];
367 404
		classes[classIndex] = aux;
405
		((LabelClassTableModel)tblClasses.getModel()).setClassArray(classes);
368 406
	}
369 407

  
370 408
	public void actionPerformed(ActionEvent e) {
......
372 410

  
373 411

  
374 412
		JComponent c = (JComponent)e.getSource();
413
		LabelClassTableModel mod = ((LabelClassTableModel) tblClasses.getModel());
414

  
375 415
		if (c.equals(btnAddClass)) {
376 416

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

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

  
383 421
			int count = 0;
384 422
			while(checSameLablClassName(mod,name)){
385 423
				count++;
......
388 426
			}
389 427
			newClass.setName(name);
390 428
			mod.addRow(new Object[] {newClass.getName(), newClass, newClass.getSQLQuery(), newClass.getLabelExpression(), newClass.isVisible()});
391
//			tblClasses.setModel(mod);
392

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

  
398 433
				for (int i = sRows.length-1; i >= 0 ; i--) {
399 434
					mod.removeRow(sRows[i]);
400 435
				}
401 436
			}
402 437
		} else if (c.equals(chkDefinePriorities)) {
438

  
439
			method.setDefinesPriorities(chkDefinePriorities.isSelected());
440

  
403 441
		} else  if (c.equals(chkLabel)) {
404
			LabelClassTableModel mod = ((LabelClassTableModel) getTblClasses().getModel());
405
			int[] sRows = getTblClasses().getSelectedRows();
442
			int[] sRows = tblClasses.getSelectedRows();
406 443
			for (int i = sRows.length-1; i >= 0 ; i--) {
407 444
				LabelClass lc = mod.getLabelAtRow(i);
408 445
				lc.setVisible(chkLabel.isSelected());
409 446
			}
447

  
410 448
		} else if (c.equals(btnMoveUpClass)) {
411
			int[] indices = getTblClasses().getSelectedRows();
449
			int[] indices = tblClasses.getSelectedRows();
412 450
			if (indices.length>0) {
413 451
				int classIndex = indices[0];
414 452
				int targetPos = Math.max(0, classIndex-1);
......
416 454
			}
417 455

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

  
426 464
		}else if (c.equals(btnDelClass)) {
427
			int[] indices = getTblClasses().getSelectedRows();
465
			int[] indices = tblClasses.getSelectedRows();
428 466
			if (indices.length>0) {
429 467
				int classIndex = indices[0];
430
				int targetPos = Math.min(getTblClasses().getRowCount(), classIndex);
468
				int targetPos = Math.min(tblClasses.getRowCount(), classIndex);
431 469
				swapClass(classIndex, targetPos,indices.length);
432 470
			}
433 471
		}
434
		method.setDefinesPriorities(chkDefinePriorities.isSelected());
472

  
473
		mod.fireTableDataChanged();
435 474
		method.clearAllClasses();
436 475
		LabelClass[] classes = ((LabelClassTableModel)tblClasses.getModel()).toLabelClassArray();
437 476
		for (int i = 0; i < classes.length; i++) {
438 477
			method.addLabelClass(classes[i]);
439 478
		}
440

  
479
		repaint();
441 480
	}
481
	public void propertyChange(PropertyChangeEvent evt) {
482
		// TODO Auto-generated method stub
442 483

  
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 484
	}
450 485

  
451 486

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

  
456
	}
488

  
489

  
490

  
457 491
}

Also available in: Unified diff