|
From: <bma...@us...> - 2011-07-05 09:28:49
|
Revision: 6321
http://fudaa.svn.sourceforge.net/fudaa/?rev=6321&view=rev
Author: bmarchan
Date: 2011-07-05 09:28:42 +0000 (Tue, 05 Jul 2011)
Log Message:
-----------
Add : Tri possible sur les geometries d'un calque.
Modified Paths:
--------------
trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesCommonEditorPanel.java
trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesEditorPanel.java
trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesMultiEditorPanel.java
trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/ZEditorDefault.java
Added Paths:
-----------
trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsEditorPanel.java
trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsMultiEditorPanel.java
Removed Paths:
-------------
trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/GISGuiBuilder.java
Modified: trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesCommonEditorPanel.java
===================================================================
--- trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesCommonEditorPanel.java 2011-07-05 09:27:45 UTC (rev 6320)
+++ trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesCommonEditorPanel.java 2011-07-05 09:28:42 UTC (rev 6321)
@@ -19,6 +19,8 @@
import com.memoire.bu.BuGridLayout;
import com.memoire.bu.BuTextField;
+import java.awt.BorderLayout;
+import javax.swing.JPanel;
import org.fudaa.ctulu.CtuluCommandComposite;
import org.fudaa.ctulu.CtuluCommandContainer;
@@ -122,7 +124,9 @@
if (editors_.length != values_.length) {
throw new IllegalArgumentException("same size required");
}
- setLayout(new BuGridLayout(2, 5, 5));
+
+ JPanel pnAttrs=new JPanel();
+ pnAttrs.setLayout(new BuGridLayout(2, 5, 5));
comps_ = new JComponent[editors_.length];
lbs_ = new JLabel[editors_.length];
oldValues_ = new Object[lbs_.length];
@@ -142,10 +146,27 @@
}
lbs_[i] = new JLabel(_names[i].toString());
lbs_[i].setLabelFor(comps_[i]);
- add(lbs_[i]);
- add(comps_[i]);
+ pnAttrs.add(lbs_[i]);
+ pnAttrs.add(comps_[i]);
}
+ setLayout(new BorderLayout());
+ add(pnAttrs);
}
+
+ /**
+ * Definit les indice selectionn\xE9s
+ * @param _idx Les indices
+ */
+ public void setIdx(int[] _idx) {
+ idx_=_idx;
+ for (int i = 0; i < comps_.length; i++) {
+ final boolean isCommon = (CtuluLibArray.isEmpty(_idx) || idx_.length == 1) ? true : values_[i].isSameValues(idx_);
+ if (isCommon) {
+ oldValues_[i] = values_[i].getObjectValueAt(_idx == null ? 0 : _idx[0]);
+ editors_[i].setValue(oldValues_[i], comps_[i]);
+ }
+ }
+ }
protected CtuluCommandComposite internApply() {
final CtuluCommandComposite cmp = new CtuluCommandComposite();
Modified: trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesEditorPanel.java
===================================================================
--- trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesEditorPanel.java 2011-07-05 09:27:45 UTC (rev 6320)
+++ trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesEditorPanel.java 2011-07-05 09:28:42 UTC (rev 6321)
@@ -18,6 +18,8 @@
import com.memoire.bu.BuHorizontalLayout;
import com.memoire.bu.BuPanel;
import com.memoire.bu.BuRadioButton;
+import com.memoire.bu.BuVerticalLayout;
+import javax.swing.JPanel;
import org.fudaa.ctulu.CtuluCommandContainer;
import org.fudaa.ctulu.CtuluLib;
@@ -30,15 +32,17 @@
*/
public class CtuluValuesEditorPanel extends CtuluDialogPanel {
- CtuluValuesCommonEditorPanel common_;
+ protected CtuluValuesCommonEditorPanel common_;
CtuluDialogPanel current_;
- CtuluValuesMultiEditorPanel multi_;
+ protected CtuluValuesMultiEditorPanel multi_;
JDialog parent_;
BuRadioButton rdCommon_;
+ protected JPanel pnNorth_;
+
public CtuluValuesEditorPanel(final CtuluValuesParameters _params, final CtuluCommandContainer _cmd) {
this(_params.getNames(), _params.getIdx(), _params.getEditors(), _params.getValues(), _cmd);
@@ -56,7 +60,16 @@
*/
public CtuluValuesEditorPanel(final Object[] _names, final int[] _idx, final CtuluValueEditorI[] _editors,
final CtuluCollection[] _values, final CtuluCommandContainer _cmd) {
- multi_ = new CtuluValuesMultiEditorPanel(_names, _idx, _editors, _values);
+ this(new CtuluValuesMultiEditorPanel(_names, _idx, _editors, _values), _cmd);
+ }
+
+ /**
+ * Constructeur, avec le panneau des valeurs d\xE9ja construit.
+ * @param _pn Le panneau des valeurs.
+ * @param _cmd Le manager undo/redo
+ */
+ public CtuluValuesEditorPanel(final CtuluValuesMultiEditorPanel _pn, final CtuluCommandContainer _cmd) {
+ multi_ = _pn;
init(_cmd);
}
@@ -94,7 +107,10 @@
});
pn.setBorder(BorderFactory.createTitledBorder(CtuluLib.getS("Mode d'\xE9dition")));
- add(pn, BuBorderLayout.NORTH);
+ pnNorth_=new JPanel();
+ pnNorth_.setLayout(new BuVerticalLayout());
+ pnNorth_.add(pn);
+ add(pnNorth_, BuBorderLayout.NORTH);
}
@@ -126,10 +142,12 @@
parent_ = _parent;
}
+ @Override
public void apply() {
current_.apply();
}
+ @Override
public boolean isDataValid() {
return current_.isDataValid();
}
Modified: trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesMultiEditorPanel.java
===================================================================
--- trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesMultiEditorPanel.java 2011-07-05 09:27:45 UTC (rev 6320)
+++ trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesMultiEditorPanel.java 2011-07-05 09:28:42 UTC (rev 6321)
@@ -7,8 +7,6 @@
*/
package org.fudaa.ctulu.gui;
-import gnu.trove.TIntObjectHashMap;
-import gnu.trove.TIntObjectIterator;
import java.awt.Color;
import java.awt.Component;
@@ -20,6 +18,8 @@
import com.memoire.bu.BuBorderLayout;
import com.memoire.bu.BuScrollPane;
+import java.util.ArrayList;
+import java.util.List;
import org.fudaa.ctulu.CtuluCommandComposite;
import org.fudaa.ctulu.CtuluCommandContainer;
@@ -30,27 +30,66 @@
import org.fudaa.ctulu.table.CtuluTable;
/**
- * @author Fred Deniger
+ * Un editeur de collections de valeurs.
+ *
+ * @author Fred Deniger, mar...@de...
* @version $Id: CtuluValuesMultiEditorPanel.java,v 1.12 2007-03-09 08:37:37 deniger Exp $
*/
public class CtuluValuesMultiEditorPanel extends CtuluDialogPanel {
- final CtuluValueEditorI[] editors_;
+ protected final CtuluValueEditorI[] editors_;
+ protected final CtuluCollection[] values_;
+ protected final Object[] title_;
+ /** Les seuls indices de mod\xE8le selectionn\xE9s \xE0 l'origine */
+ protected int[] idxMdlSel_;
+ /** Les lignes, dans l'ordre */
+ protected List<Row> rows_;
+ protected JTable table_;
+ protected CtuluCommandContainer cmd_;
+ protected ValueTableModel model_;
+
+ /**
+ * Une ligne du tableau, sans la colonne des indices.
+ */
+ protected class Row {
+ /** Les valeurs initiales des cellules correspondantes aux attributs */
+ private Object[] cells_;
+ /** Les valeurs modifi\xE9es, null si pas modifi\xE9e */
+ private Object[] modCells_;
- final CtuluCollection[] values_;
+ public Row(Object[] _values) {
+ cells_=_values;
+ }
+
+ public void setValue(Object _obj, int _col) {
+ if (modCells_==null)
+ modCells_=new Object[cells_.length];
+
+ if (cells_[_col].equals(_obj))
+ modCells_[_col]=null;
+ else
+ modCells_[_col]=_obj;
+ }
+
+ public Object getValue(int _col) {
+ if (modCells_!=null && modCells_[_col]!=null)
+ return modCells_[_col];
+ else
+ return cells_[_col];
+ }
+
+ public boolean isModified(int _col) {
+ return modCells_!=null && modCells_[_col]!=null;
+ }
+ }
- final Object[] title_;
-
- final int[] idx_;
-
- CtuluCommandContainer cmd_;
-
+ /**
+ * Le modele du tableau.
+ */
class ValueTableModel extends AbstractTableModel {
- TIntObjectHashMap[] realIdxnewValues_;
-
private int getRealIdx(final int _rowIdx) {
- return idx_[_rowIdx];
+ return convertViewToMdlIdx(_rowIdx);
}
public int getColumnCount() {
@@ -72,7 +111,7 @@
}
public int getRowCount() {
- return idx_.length;
+ return idxMdlSel_.length;
}
public boolean isCellEditable(final int _rowIndex, final int _columnIndex) {
@@ -91,57 +130,20 @@
return;
}
final int realIdx = getRealIdx(_rowIndex);
- if (_value == null || _value.equals(values_[var].getObjectValueAt(realIdx))) {
- if (realIdxnewValues_ != null && realIdxnewValues_[var] != null) {
- realIdxnewValues_[var].remove(realIdx);
- }
- return;
-
- }
- if (realIdxnewValues_ == null) {
- realIdxnewValues_ = new TIntObjectHashMap[editors_.length];
- }
-
- if (realIdxnewValues_[var] == null) {
- realIdxnewValues_[var] = new TIntObjectHashMap(idx_.length);
- }
- realIdxnewValues_[var].put(realIdx, _value);
+ rows_.get(realIdx).setValue(_value, var);
}
- public void apply() {
- if (realIdxnewValues_ != null) {
- final CtuluCommandComposite cmp = new CtuluCommandComposite();
- for (int i = realIdxnewValues_.length - 1; i >= 0; i--) {
- if (realIdxnewValues_[i] != null) {
- final TIntObjectIterator it = realIdxnewValues_[i].iterator();
- for (int k = realIdxnewValues_[i].size(); k-- > 0;) {
- it.advance();
- values_[i].setObject(it.key(), it.value(), cmp);
- }
- }
- }
- if (cmd_ != null) {
- cmd_.addCmd(cmp.getSimplify());
- }
- }
- }
-
public boolean isModified(final int _rowIndex, final int _columnIndex) {
final int realIdx = getRealIdx(_rowIndex);
- final int var = _columnIndex - 1;
- return realIdxnewValues_ != null && realIdxnewValues_[var] != null && realIdxnewValues_[var].contains(realIdx);
+ return rows_.get(realIdx).isModified(_columnIndex-1);
}
public Object getValueAt(final int _rowIndex, final int _columnIndex) {
final int realIdx = getRealIdx(_rowIndex);
if (_columnIndex == 0) {
- return CtuluLibString.getString(realIdx + 1);
+ return CtuluLibString.getString(idxMdlSel_[_rowIndex]+1);
}
- final int var = _columnIndex - 1;
- if (realIdxnewValues_ != null && realIdxnewValues_[var] != null && realIdxnewValues_[var].contains(realIdx)) {
- return realIdxnewValues_[var].get(realIdx);
- }
- return values_[var].getObjectValueAt(realIdx);
+ return rows_.get(realIdx).getValue(_columnIndex-1);
}
}
@@ -159,21 +161,21 @@
cmd_ = _cmd;
}
- ValueTableModel model_;
-
/**
* @param _names les noms (non null)
- * @param _idx les indices a modifier.
+ * @param _idxMdlSel les indices s\xE9lectionn\xE9s.
* @param _editors les editeurs
* @param _values les valeurs (meme taille que les editeurs)
*/
- public CtuluValuesMultiEditorPanel(final Object[] _names, final int[] _idx, final CtuluValueEditorI[] _editors,
+ public CtuluValuesMultiEditorPanel(final Object[] _names, final int[] _idxMdlSel, final CtuluValueEditorI[] _editors,
final CtuluCollection[] _values) {
editors_ = _editors;
values_ = _values;
title_ = _names;
- idx_ = _idx;
+ idxMdlSel_ = _idxMdlSel;
+
init();
+ buildRows();
}
public CtuluValuesMultiEditorPanel(final CtuluValuesParameters _params) {
@@ -181,19 +183,49 @@
}
public CtuluValuesCommonEditorPanel createCommon() {
- final CtuluValuesCommonEditorPanel res = new CtuluValuesCommonEditorPanel(title_, idx_, editors_, values_);
+ final CtuluValuesCommonEditorPanel res = new CtuluValuesCommonEditorPanel(title_, idxMdlSel_, editors_, values_);
res.setCmd(cmd_);
return res;
}
-
- protected final void init() {
+
+ /**
+ * @return La selection initiale
+ */
+ public int[] getSelectedIndexes() {
+ return idxMdlSel_;
+ }
+
+ /**
+ * Construit les lignes.
+ */
+ private void buildRows() {
+ rows_=new ArrayList<Row>();
+ for (int i=0; i<values_[0].getSize(); i++) {
+ Object[] cells=new Object[values_.length];
+ for (int j=0; j<cells.length; j++) {
+ cells[j]=values_[j].getObjectValueAt(i);
+ }
+ addRow(cells);
+ }
+ }
+
+ protected void addRow(Object[] _cells) {
+ rows_.add(new Row(_cells));
+ }
+
+ protected int convertViewToMdlIdx(int _idx) {
+ return idxMdlSel_[_idx];
+ }
+
+ protected void init() {
if (editors_.length != values_.length) {
throw new IllegalArgumentException("same size required");
}
setLayout(new BuBorderLayout());
+
model_ = new ValueTableModel();
table_ = new CtuluTable();
- table_.setCellSelectionEnabled(true);
+ table_.setRowSelectionAllowed(true);
table_.setModel(model_);
final TableColumnModel model = table_.getColumnModel();
final CtuluCellTextRenderer render = new CtuluCellTextRenderer() {
@@ -220,14 +252,23 @@
add(new BuScrollPane(table_), BuBorderLayout.CENTER);
}
- JTable table_;
-
public void apply() {
// on arrete la saisie avant d'appliquer les modifs
if (table_.isEditing()) {
table_.getCellEditor().stopCellEditing();
}
- model_.apply();
+
+ // Mise a jour des champs.
+ final CtuluCommandComposite cmp=new CtuluCommandComposite(CtuluLib.getS("Edition des g\xE9om\xE9tries"));
+ for (int irow=0; irow < rows_.size(); irow++) {
+ for (int icol=0; icol < values_.length; icol++) {
+ if (rows_.get(irow).isModified(icol)) {
+ values_[icol].setObject(irow, rows_.get(irow).getValue(icol), cmp);
+ }
+ }
+ }
+ if (cmd_ != null) {
+ cmd_.addCmd(cmp.getSimplify());
+ }
}
-
}
Added: trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsEditorPanel.java
===================================================================
--- trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsEditorPanel.java (rev 0)
+++ trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsEditorPanel.java 2011-07-05 09:28:42 UTC (rev 6321)
@@ -0,0 +1,55 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.fudaa.ebli.calque.edition;
+
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import javax.swing.JCheckBox;
+import org.fudaa.ctulu.CtuluCommandContainer;
+import org.fudaa.ctulu.gis.GISZoneCollection;
+import org.fudaa.ctulu.gui.CtuluValuesEditorPanel;
+import org.fudaa.ebli.commun.EbliLib;
+
+/**
+ * Un editeur pour plusieurs objets d'un meme calque.
+ * Cet editeur permet de modifier les valeurs des g\xE9om\xE9tries, mais aussi de
+ * trier les g\xE9om\xE9tries dans le calque.
+ *
+ * @author mar...@de...
+ */
+public class EbliObjetsEditorPanel extends CtuluValuesEditorPanel {
+
+ /**
+ * Constructeur.
+ * @param _zone La collection contenant les g\xE9om\xE9tries.
+ * @param _idx Les indices des objets selectionn\xE9s.
+ * @param _cmd Le manager undo/redo
+ */
+ public EbliObjetsEditorPanel(final GISZoneCollection _zone, final int[] _idx, final CtuluCommandContainer _cmd) {
+ super(new EbliObjetsMultiEditorPanel(_zone,_idx),_cmd);
+ decorePanel();
+ }
+
+ /**
+ * Ajoute au panneau une checkbox pour switcher de la selection a toutes les g\xE9om\xE9tries
+ */
+ private void decorePanel() {
+ final JCheckBox cbAllGeom=new JCheckBox(EbliLib.getS("Sur tous les \xE9lements du calque"),false);
+ cbAllGeom.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent e) {
+ ((EbliObjetsMultiEditorPanel)multi_).setFiltered(cbAllGeom.isSelected());
+ if (common_!=null) common_.setIdx(((EbliObjetsMultiEditorPanel)multi_).getSelectedIndexes());
+ }
+ });
+ pnNorth_.add(cbAllGeom);
+ }
+
+ /**
+ * @return True Si des valeurs sont \xE9ditables.
+ */
+ public boolean hasEditableData() {
+ return ((EbliObjetsMultiEditorPanel)multi_).hasEditableData();
+ }
+}
Property changes on: trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsEditorPanel.java
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Copied: trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsMultiEditorPanel.java (from rev 6315, trunk/framework/ctulu-ui/src/main/java/org/fudaa/ctulu/gui/CtuluValuesMultiEditorPanel.java)
===================================================================
--- trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsMultiEditorPanel.java (rev 0)
+++ trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/EbliObjetsMultiEditorPanel.java 2011-07-05 09:28:42 UTC (rev 6321)
@@ -0,0 +1,513 @@
+/*
+ * @creation 20 avr. 2005
+ * @modification $Date: 2007-03-09 08:37:37 $
+ * @license GNU General Public License 2
+ * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
+ * @mail de...@fu...
+ */
+package org.fudaa.ebli.calque.edition;
+
+
+
+
+import com.memoire.bu.BuButton;
+import com.memoire.bu.BuLabel;
+import com.memoire.bu.BuResource;
+import com.memoire.bu.BuVerticalLayout;
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import javax.swing.BorderFactory;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import org.fudaa.ctulu.CtuluCommandComposite;
+import org.fudaa.ctulu.CtuluLib;
+
+import org.fudaa.ctulu.collection.CtuluCollection;
+import org.fudaa.ctulu.editor.CtuluValueEditorDefaults;
+import org.fudaa.ctulu.editor.CtuluValueEditorI;
+import org.fudaa.ctulu.gis.GISAttributeInterface;
+import org.fudaa.ctulu.gis.GISAttributeModel;
+import org.fudaa.ctulu.gis.GISZoneCollection;
+import org.fudaa.ctulu.gis.GISZoneCollectionPoint;
+import org.fudaa.ctulu.gui.CtuluValuesMultiEditorPanel;
+import org.fudaa.ctulu.gui.CtuluValuesParameters;
+import org.fudaa.ctulu.gui.CtuluValuesParametersDefault;
+
+/**
+ * Un editeur pour les g\xE9om\xE9tries d'un calque. Permet l'\xE9dition des g\xE9om\xE9tries
+ * et leur reordonnancement.
+ *
+ * @author mar...@de...
+ * @version $Id: CtuluValuesMultiEditorPanel.java,v 1.12 2007-03-09 08:37:37 deniger Exp $
+ */
+public class EbliObjetsMultiEditorPanel extends CtuluValuesMultiEditorPanel {
+
+ private BuButton btUp_;
+ private BuButton btDown_;
+ private JComboBox cbSort_;
+ private BuButton btInvertSort_;
+ /** True : Seules les g\xE9om\xE9tries s\xE9lectionn\xE9es sont prisent en compte */
+ private boolean isFiltered_=true;
+ private GISZoneCollection zone_;
+ /** Indice de zone vers sortable row */
+ private HashMap<Integer,SortableRow> ind2Row=new HashMap<Integer, SortableRow>();
+ /** Les comparateurs pour chaque colonne */
+ private final List<ValueRowComparator> comparators_;
+ private final int[] idxInitMdlSel_;
+
+ /**
+ * Une ligne triable du tableau
+ */
+ class SortableRow extends Row {
+ /** L'index dans la zone */
+ private int indZone;
+
+ public SortableRow(int _ind, Object[] _values) {
+ super(_values);
+ indZone=_ind;
+ }
+ }
+
+ /**
+ * Un comparateur de lignes du tableau. Permet le tri initial
+ */
+ class InitialRowComparator implements Comparator<Row> {
+ public int compare(Row o1, Row o2) {
+ return ((SortableRow)o1).indZone-((SortableRow)o2).indZone;
+ }
+ }
+
+ /**
+ * Un comparateur de lignes du tableau, suivant la colonne choisie.
+ */
+ class ValueRowComparator implements Comparator<Row> {
+ private int sortableColumn=0;
+ private Comparator comparator_;
+
+ public ValueRowComparator(int _col, Comparator _comp) {
+ sortableColumn=_col;
+ comparator_=_comp;
+ }
+
+ public int compare(Row o1, Row o2) {
+ return comparator_.compare(o1.getValue(sortableColumn), o2.getValue(sortableColumn));
+ }
+ }
+
+ /**
+ * @param _zone La collection des g\xE9om\xE9tries.
+ * @param _idx Les indices selectionn\xE9s.
+ */
+ public EbliObjetsMultiEditorPanel(GISZoneCollection _zone, final int[] _idx) {
+ super(buildParams(_zone, _idx));
+
+ zone_=_zone;
+ idxInitMdlSel_=_idx;
+
+ for (Row row : rows_) {
+ SortableRow sr=(SortableRow)row;
+ ind2Row.put(sr.indZone, sr);
+ }
+
+ comparators_=new ArrayList();
+ buildComparators();
+ decorePanel();
+ }
+
+ /**
+ * Contruit les param\xE8tres pour la classe mere depuis la collection.
+ * @param _zone La collection
+ * @param _idx Les indices selectionn\xE9s
+ * @return Les param\xE8tres.
+ */
+ private static CtuluValuesParameters buildParams(final GISZoneCollection _zone, final int[] _idx) {
+ CtuluValuesParametersDefault params=new CtuluValuesParametersDefault();
+
+ final List<String> names=new ArrayList<String>(_zone.getNbAttributes() + 2);
+ final List<CtuluValueEditorI> editor=new ArrayList<CtuluValueEditorI>(names.size());
+ final List<CtuluCollection> model=new ArrayList<CtuluCollection>(names.size());
+
+ // Pour une collection de points
+ if (_zone instanceof GISZoneCollectionPoint) {
+ GISZoneCollectionPoint ptZone=(GISZoneCollectionPoint)_zone;
+
+ names.add("X");
+ names.add("Y");
+ editor.add(CtuluValueEditorDefaults.DOUBLE_EDITOR);
+ editor.add(CtuluValueEditorDefaults.DOUBLE_EDITOR);
+ model.add(ptZone.createEditForX());
+ model.add(ptZone.createEditForY());
+ for (int i=0; i < ptZone.getNbAttributes(); i++) {
+ // FIXME BM: G\xE9rer attribut non visible.
+ if (ptZone.getAttribute(i).isEditable()) {
+ names.add(ptZone.getAttribute(i).getName());
+ editor.add(ptZone.getAttribute(i).getEditor());
+ model.add(ptZone.getDataModel(i));
+ }
+ }
+ }
+
+ // Pour tout autre type
+ else {
+ final int nbAtt=_zone.getNbAttributes();
+ for (int i=0; i < nbAtt; i++) {
+ final GISAttributeInterface att=_zone.getAttribute(i);
+ // FIXME BM: G\xE9rer attribut non visible.
+ if (!att.isAtomicValue() && att.isEditable()) {
+ names.add(att.getName());
+ editor.add(att.getEditor());
+ model.add(_zone.getDataModel(i));
+ }
+ }
+ params.editors_=new CtuluValueEditorI[editor.size()];
+ params.names_=new String[names.size()];
+ params.values_=new GISAttributeModel[model.size()];
+
+ }
+
+ params.idx_=_idx;
+ params.names_=names.toArray(new String[0]);
+ params.editors_=editor.toArray(new CtuluValueEditorI[0]);
+ params.values_=model.toArray(new CtuluCollection[0]);
+
+ return params;
+ }
+
+ /**
+ * Construit les comparateurs pour chaque colonne.
+ */
+ private void buildComparators() {
+ // Pour une collection de points
+ if (zone_ instanceof GISZoneCollectionPoint) {
+ // Comparateur pour X
+ comparators_.add(new ValueRowComparator(comparators_.size(),new Comparator<Double>() {
+ public int compare(Double o1, Double o2) {
+ return o1.compareTo(o2);
+ }
+ }));
+ // Comparateur pour Y
+ comparators_.add(new ValueRowComparator(comparators_.size(),new Comparator<Double>() {
+ public int compare(Double o1, Double o2) {
+ return o1.compareTo(o2);
+ }
+ }));
+ // Les autres comparateurs
+ for (int i=0; i < zone_.getNbAttributes(); i++) {
+ final GISAttributeInterface att=zone_.getAttribute(i);
+ // FIXME BM: G\xE9rer attribut non visible.
+ if (att.isEditable()) {
+ comparators_.add(new ValueRowComparator(comparators_.size(), att.getComparator()));
+ }
+ }
+ }
+ // Pour toute autre liste
+ else {
+ for (int i=0; i < zone_.getNbAttributes(); i++) {
+ final GISAttributeInterface att=zone_.getAttribute(i);
+ // FIXME BM: G\xE9rer attribut non visible.
+ if (!att.isAtomicValue() && att.isEditable()) {
+ comparators_.add(new ValueRowComparator(comparators_.size(), att.getComparator()));
+ }
+ }
+ }
+ }
+
+ @Override
+ public void addRow(Object[] _cells) {
+ rows_.add(new SortableRow(rows_.size(), _cells));
+ }
+
+ private void initialSort() {
+ int[] idxMdl=convertViewToZoneIdx(table_.getSelectedRows());
+
+ Collections.sort(rows_, new InitialRowComparator());
+
+ int[] idxSel=convertZoneToViewIdx(idxMdl);
+ resetSelection(idxSel);
+ }
+
+ private void columnSort(int _col) {
+ int[] idxMdl=convertViewToZoneIdx(table_.getSelectedRows());
+
+ Collections.sort(rows_, new InitialRowComparator()); // Pour remettre dans un ordre de depart.
+ Collections.sort(rows_, comparators_.get(_col-1));
+
+ int[] idxSel=convertZoneToViewIdx(idxMdl);
+ resetSelection(idxSel);
+ }
+
+ private void invertSort() {
+ int[] idxMdl=convertViewToZoneIdx(table_.getSelectedRows());
+
+ for (int i=0; i<rows_.size()/2; i++) {
+ Row tmp=rows_.get(i);
+ rows_.set(i, rows_.get(rows_.size()-1-i));
+ rows_.set(rows_.size()-1-i,tmp);
+ }
+
+ int[] idxSel=convertZoneToViewIdx(idxMdl);
+ resetSelection(idxSel);
+ }
+
+ private void upIndexes() {
+ int[] idxSel=table_.getSelectedRows();
+ int[] idxMdl=convertViewToZoneIdx(idxSel);
+
+ for (int i=0; i<idxSel.length; i++) {
+ if (idxSel[i]>i) {
+ Row tmp=rows_.get(idxSel[i]-1);
+ rows_.set(idxSel[i]-1,rows_.get(idxSel[i]));
+ rows_.set(idxSel[i],tmp);
+ }
+ }
+
+ idxSel=convertZoneToViewIdx(idxMdl);
+ resetSelection(idxSel);
+ }
+
+ private void downIndexes() {
+ int[] idxSel=table_.getSelectedRows();
+ int[] idxMdl=convertViewToZoneIdx(idxSel);
+
+ for (int i=idxSel.length-1; i>=0; i--) {
+ if (idxSel[i]<rows_.size()-idxSel.length+i) {
+ Row tmp=rows_.get(idxSel[i]);
+ rows_.set(idxSel[i],rows_.get(idxSel[i]+1));
+ rows_.set(idxSel[i]+1,tmp);
+ }
+ }
+
+ idxSel=convertZoneToViewIdx(idxMdl);
+ resetSelection(idxSel);
+ }
+
+ private void resetSelection(int[] _idxSel) {
+ table_.getSelectionModel().clearSelection();
+ for (int i=0; i<_idxSel.length; i++) {
+ table_.getSelectionModel().addSelectionInterval(_idxSel[i], _idxSel[i]);
+ }
+ }
+
+ /**
+ * Filtre ou non sur la selection
+ * @param _b True : N'affiche que la selection. False : Toutes les geometries du calque.
+ */
+ public void setFiltered(boolean _b) {
+ isFiltered_ = !_b;
+ if (isFiltered_) {
+ idxMdlSel_=convertZoneToViewIdx(idxInitMdlSel_);
+ }
+ else {
+ idxMdlSel_=new int[rows_.size()];
+ for (int i=0; i<idxMdlSel_.length; i++) idxMdlSel_[i]=i;
+ }
+
+ btInvertSort_.setEnabled(!isFiltered_);
+ cbSort_.setEnabled(!isFiltered_);
+ tableSelectionChanged();
+
+ table_.revalidate();
+ table_.repaint();
+ }
+
+ /**
+ * Verifie qu'il existe bien des geometries modifiables.
+ * @return True : Des g\xE9om\xE9tries sont modifiables.
+ */
+ public boolean hasEditableData() {
+ return title_.length>0;
+ }
+
+ /**
+ * Convertit les index de vue vers les indexs de la zone
+ * @param _idx Les index de vue
+ * @return Les index de la zone
+ */
+ private int[] convertViewToZoneIdx(int[] _idx) {
+ int[] idx=new int[_idx.length];
+
+ for (int i=0; i<_idx.length; i++) {
+ idx[i]=((SortableRow)rows_.get(_idx[i])).indZone;
+ }
+ return idx;
+ }
+
+ /**
+ * Converti les index de zone vers les index de vue.
+ * @param _idx Les index de zone
+ * @return Les index de vue. Attention, en cas de filtre, certains indices
+ * retourn\xE9s peuvent valoir -1 (si l'indice zone n'est pas visualis\xE9).
+ */
+ private int[] convertZoneToViewIdx(int... _idx) {
+ int[] idx=new int[_idx.length];
+
+ for (int i=0; i<_idx.length; i++) {
+ idx[i]=rows_.indexOf(ind2Row.get(_idx[i]));
+ }
+ return idx;
+ }
+
+ private void tableSelectionChanged() {
+ btUp_.setEnabled(!isFiltered_ && table_.getSelectedRowCount() != 0);
+ btDown_.setEnabled(!isFiltered_ && table_.getSelectedRowCount() != 0);
+ }
+
+ private void btUpActionPerformed() {
+ if (table_.isEditing()) {
+ table_.getCellEditor().stopCellEditing();
+ }
+ upIndexes();
+ table_.revalidate();
+ table_.repaint();
+ cbSort_.setSelectedIndex(0);
+ }
+
+ private void btDownActionPerformed() {
+ if (table_.isEditing()) {
+ table_.getCellEditor().stopCellEditing();
+ }
+ downIndexes();
+ table_.revalidate();
+ table_.repaint();
+ cbSort_.setSelectedIndex(0);
+ }
+
+ private void btInvertActionPerformed() {
+ if (table_.isEditing()) {
+ table_.getCellEditor().stopCellEditing();
+ }
+ invertSort();
+ table_.revalidate();
+ table_.repaint();
+ cbSort_.setSelectedIndex(0);
+ }
+
+ private void cbSortActionPerformed() {
+ if (cbSort_.getSelectedIndex() == 1) {
+ initialSort();
+ }
+ // Tri par comparateur de colonne
+ else if (cbSort_.getSelectedIndex()>1) {
+ columnSort(cbSort_.getSelectedIndex()-1);
+ }
+ table_.revalidate();
+ table_.repaint();
+ }
+
+ /**
+ * Ajoute des options de r\xE9ordonnancement \xE0 l'editeur g\xE9n\xE9rique.
+ */
+ private void decorePanel() {
+ table_.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(ListSelectionEvent e) {
+ tableSelectionChanged();
+ }
+ });
+
+ btUp_=new BuButton(BuResource.BU.getIcon(CtuluLib.getS("monter")));
+ btUp_.setToolTipText(CtuluLib.getS("D\xE9cr\xE9menter l'index"));
+ btDown_=new BuButton(BuResource.BU.getIcon(CtuluLib.getS("descendre")));
+ btDown_.setToolTipText(CtuluLib.getS("Incr\xE9menter l'index"));
+ btUp_.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ btUpActionPerformed();
+ }
+ });
+ btDown_.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ btDownActionPerformed();
+ }
+ });
+
+ JPanel pnMove=new JPanel();
+ pnMove.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 0));
+ pnMove.add(new BuLabel(CtuluLib.getS("Changer l'ordre des g\xE9om\xE9tries")));
+ pnMove.add(btUp_);
+ pnMove.add(btDown_);
+
+ JLabel lbSort=new JLabel(CtuluLib.getS("Trier les g\xE9om\xE9tries suivant"));
+ cbSort_=new JComboBox();
+ cbSort_.addItem("");
+ cbSort_.addItem("<"+CtuluLib.getS("Ordre initial")+">");
+ for (Object title : title_) {
+ cbSort_.addItem(title.toString());
+ }
+ cbSort_.setEnabled(false);
+ cbSort_.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ cbSortActionPerformed();
+ }
+ });
+ btInvertSort_=new BuButton(CtuluLib.getS("Inverser l'ordre"));
+ btInvertSort_.setEnabled(false);
+ btInvertSort_.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ btInvertActionPerformed();
+ }
+ });
+ JPanel pnSort=new JPanel();
+ pnSort.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 0));
+ pnSort.add(lbSort);
+ pnSort.add(cbSort_);
+ pnSort.add(btInvertSort_);
+
+ JPanel pnReorder=new JPanel();
+ pnReorder.setLayout(new BuVerticalLayout(2));
+ pnReorder.add(pnMove);
+ pnReorder.add(pnSort);
+ pnReorder.setBorder(BorderFactory.createTitledBorder(CtuluLib.getS("R\xE9ordonner")));
+
+ add(pnReorder,BorderLayout.SOUTH);
+
+ tableSelectionChanged();
+ }
+
+ @Override
+ public void apply() {
+ // on arrete la saisie avant d'appliquer les modifs
+ if (table_.isEditing()) {
+ table_.getCellEditor().stopCellEditing();
+ }
+
+ final CtuluCommandComposite cmp=new CtuluCommandComposite(CtuluLib.getS("Edition des g\xE9om\xE9tries"));
+
+ for (int irow=0; irow < rows_.size(); irow++) {
+ int initInd=((SortableRow) rows_.get(irow)).indZone;
+ // Les lignes ont \xE9t\xE9 d\xE9plac\xE9es => Il faut d\xE9placer aussi les g\xE9om\xE9tries dans la collection.
+ if (initInd != irow) {
+ // Les g\xE9om\xE9tries sont switch\xE9es, les index initiaux aussi.
+ zone_.switchGeometries(irow, initInd, cmp);
+ // Les index initiaux aussi
+ for (int i=irow + 1; i < rows_.size(); i++) {
+ SortableRow row=(SortableRow) rows_.get(i);
+ if (row.indZone == irow) {
+ row.indZone=initInd;
+ break;
+ }
+ }
+ ((SortableRow) rows_.get(irow)).indZone=irow;
+ }
+
+ // Remplacement des valeurs modifi\xE9es.
+ for (int icol=0; icol < values_.length; icol++) {
+ if (rows_.get(irow).isModified(icol)) {
+ values_[icol].setObject(irow, rows_.get(irow).getValue(icol), cmp);
+ }
+ }
+ }
+ if (cmd_ != null) {
+ cmd_.addCmd(cmp.getSimplify());
+ }
+
+ }
+}
Deleted: trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/GISGuiBuilder.java
===================================================================
--- trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/GISGuiBuilder.java 2011-07-05 09:27:45 UTC (rev 6320)
+++ trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/GISGuiBuilder.java 2011-07-05 09:28:42 UTC (rev 6321)
@@ -1,90 +0,0 @@
-/*
- * @creation 9 f\xE9vr. 2006
- * @modification $Date: 2007-01-10 08:58:47 $
- * @license GNU General Public License 2
- * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
- * @mail de...@fu...
- */
-package org.fudaa.ebli.calque.edition;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.fudaa.ctulu.CtuluCommandContainer;
-import org.fudaa.ctulu.collection.CtuluCollection;
-import org.fudaa.ctulu.editor.CtuluValueEditorDefaults;
-import org.fudaa.ctulu.editor.CtuluValueEditorI;
-import org.fudaa.ctulu.gis.GISAttributeInterface;
-import org.fudaa.ctulu.gis.GISZoneCollection;
-import org.fudaa.ctulu.gis.GISZoneCollectionPoint;
-import org.fudaa.ctulu.gui.CtuluValuesEditorPanel;
-
-/**
- * Un builder de panneau d'\xE9ditions d'objets GIS.
- * @author fred deniger
- * @version $Id: GISGuiBuilder.java,v 1.5 2007-01-10 08:58:47 deniger Exp $
- */
-public final class GISGuiBuilder {
- private GISGuiBuilder() {}
-
- /**
- * Construction d'un panneau d'\xE9dition de plusieurs points d'une m\xEAme collection.
- * @param _pt La collection de points
- * @param _idx Les index des points de la collection concern\xE9s.
- * @param _cmd Le manager de commandes.
- * @return Un panneau d'\xE9dition.
- */
- public static CtuluValuesEditorPanel buildFor(final GISZoneCollectionPoint _pt, final int[] _idx, final CtuluCommandContainer _cmd) {
- final List names = new ArrayList(_pt.getNbAttributes() + 2);
- final List editor = new ArrayList(names.size());
- final List model = new ArrayList(names.size());
- names.add("X");
- names.add("Y");
- editor.add(CtuluValueEditorDefaults.DOUBLE_EDITOR);
- editor.add(CtuluValueEditorDefaults.DOUBLE_EDITOR);
- model.add(_pt.createEditForX());
- model.add(_pt.createEditForY());
- for (int i = 0; i < _pt.getNbAttributes(); i++) {
- // FIXME BM: G\xE9rer attribut non visible.
- if (_pt.getAttribute(i).isEditable()) {
- names.add(_pt.getAttribute(i).getName());
- editor.add(_pt.getAttribute(i).getEditor());
- model.add(_pt.getDataModel(i));
- }
- }
- return new CtuluValuesEditorPanel((String[]) names.toArray(new String[names.size()]), _idx,
- (CtuluValueEditorI[]) editor.toArray(new CtuluValueEditorI[editor.size()]), (CtuluCollection[]) model
- .toArray(new CtuluCollection[model.size()]), _cmd);
- }
-
- /**
- * Construction d'un panneau d'\xE9dition de plusieurs g\xE9om\xE9tries d'une m\xEAme collection.
- * @param _pt La collection
- * @param _idx Les index des g\xE9om\xE9tries de la collection concern\xE9s.
- * @param _cmd Le manager de commandes.
- * @return Un panneau d'\xE9dition.
- */
- public static CtuluValuesEditorPanel buildForGlobAtt(final GISZoneCollection _pt, final int[] _idx, final CtuluCommandContainer _cmd) {
- final int nbAtt = _pt.getNbAttributes();
- final List names = new ArrayList(nbAtt);
- final List editor = new ArrayList(nbAtt);
- final List model = new ArrayList(nbAtt);
- for (int i = 0; i < nbAtt; i++) {
- final GISAttributeInterface att = _pt.getAttribute(i);
- // FIXME BM: G\xE9rer attribut non visible.
- if (!att.isAtomicValue() && att.isEditable()) {
- names.add(att.getName());
- editor.add(att.getEditor());
- model.add(_pt.getDataModel(i));
- }
- }
- if (names.size() > 0) {
- return new CtuluValuesEditorPanel(names.toArray(new Object[names.size()]), _idx, (CtuluValueEditorI[]) editor
- .toArray(new CtuluValueEditorI[editor.size()]), (CtuluCollection[]) model
- .toArray(new CtuluCollection[model.size()]), _cmd);
- }
- return null;
-
- }
-
-}
Modified: trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/ZEditorDefault.java
===================================================================
--- trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/ZEditorDefault.java 2011-07-05 09:27:45 UTC (rev 6320)
+++ trunk/framework/ebli-2d/src/main/java/org/fudaa/ebli/calque/edition/ZEditorDefault.java 2011-07-05 09:28:42 UTC (rev 6321)
@@ -804,14 +804,14 @@
editSingleObject(calque);
else {
// Plusieurs g\xE9om\xE9tries sont \xE0 \xE9diter
- CtuluDialogPanel pn=null;
- if (calque.getModelEditable().getGeomData() instanceof GISZoneCollectionPoint)
- pn=GISGuiBuilder.buildFor((GISZoneCollectionPoint)calque.getModelEditable().getGeomData(), calque.getLayerSelection()
- .getSelectedIndex(), getMng());
- else
- pn=GISGuiBuilder.buildForGlobAtt(calque.getModelEditable().getGeomData(), calque.getLayerSelection().getSelectedIndex(),
- getMng());
- if (pn==null)
+ EbliObjetsEditorPanel pn=new EbliObjetsEditorPanel(calque.getModelEditable().getGeomData(), calque.getLayerSelection().getSelectedIndex(), getMng());
+// if (calque.getModelEditable().getGeomData() instanceof GISZoneCollectionPoint)
+// pn=GISGuiBuilder.buildFor((GISZoneCollectionPoint)calque.getModelEditable().getGeomData(), calque.getLayerSelection()
+// .getSelectedIndex(), getMng());
+// else
+// pn=GISGuiBuilder.buildForGlobAtt(calque.getModelEditable().getGeomData(), calque.getLayerSelection().getSelectedIndex(),
+// getMng());
+ if (!pn.hasEditableData())
getUi().message(calque.getTitle(), EbliLib.getS("Aucune donn\xE9e \xE0 \xE9diter"), false);
else
pn.afficheModale(getFrame(), calque.getTitle());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|