From: <emm...@us...> - 2009-01-27 14:45:48
|
Revision: 4405 http://fudaa.svn.sourceforge.net/fudaa/?rev=4405&view=rev Author: emmanuel_martin Date: 2009-01-27 14:45:39 +0000 (Tue, 27 Jan 2009) Log Message: ----------- Tache #136 : "Pouvoir r?\195?\169ordonner un point d'une polyligne par une fonction monter/descendre dans la fen?\195?\170tre du tableau d'?\195?\169dition" Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/EbliSingleObjectEditorPanel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditorDefault.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleLigneBriseeEditable.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapterErrorListener.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/EbliSingleObjectEditorPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/EbliSingleObjectEditorPanel.java 2009-01-26 22:59:34 UTC (rev 4404) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/EbliSingleObjectEditorPanel.java 2009-01-27 14:45:39 UTC (rev 4405) @@ -11,7 +11,10 @@ import java.awt.Color; import java.awt.Container; import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; @@ -25,6 +28,8 @@ import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; @@ -32,7 +37,6 @@ import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; -import org.fudaa.ctulu.CtuluAnalyze; import org.fudaa.ctulu.CtuluCommandComposite; import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluCommandManager; @@ -55,6 +59,8 @@ import org.fudaa.ebli.commun.EbliComponentFactory; import org.fudaa.ebli.commun.EbliFormatterInterface; import org.fudaa.ebli.commun.EbliLib; +import org.fudaa.ebli.commun.TableModelModeleAdapter; +import org.fudaa.ebli.commun.TableModelModeleAdapterErrorListener; import org.fudaa.ebli.courbe.EGAxeHorizontal; import org.fudaa.ebli.courbe.EGAxeVertical; import org.fudaa.ebli.courbe.EGCourbeModelProfile; @@ -64,9 +70,12 @@ import org.fudaa.ebli.courbe.EGGrapheSimpleModel; import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuButton; +import com.memoire.bu.BuCheckBox; import com.memoire.bu.BuGridLayout; import com.memoire.bu.BuLabel; import com.memoire.bu.BuPanel; +import com.memoire.bu.BuResource; import com.memoire.bu.BuScrollPane; import com.memoire.bu.BuSplit2Pane; import com.memoire.fu.FuLog; @@ -95,14 +104,16 @@ */ public class TableRepresentation extends BuPanel { - // Repr\xE9sentation graphique dans le cas o\xF9 on a un point unique \xE0 repr\xE9senter + /** Repr\xE9sentation graphique dans le cas o\xF9 on a un point unique \xE0 repr\xE9senter. */ private JComponent tfX_, tfY_; - // Repr\xE9sentation graphique dans le cas o\xF9 on plusieurs points \xE0 repr\xE9senter + /** Repr\xE9sentation graphique dans le cas o\xF9 on plusieurs points \xE0 repr\xE9senter. */ private JTable table_; - // Vrai si l'objet est en mode repr\xE9sentation par tableau + /** Vrai si l'objet est en mode repr\xE9sentation par tableau. */ private boolean isTableStat_; - // Formateur g\xE9rant le format des informations \xE0 afficher + /** Formateur g\xE9rant le format des informations \xE0 afficher. */ private final EbliFormatterInterface xyFormatter_; + /** Le checkBox indiquant le mode d'application des changements. */ + protected BuCheckBox modeChangement_; /** * @param _editAttribut @@ -156,22 +167,74 @@ setLayout(new BuBorderLayout()); // Construction de la table table_=new CtuluTable(); - table_.setModel(model_); - model_.updateCellEditor(table_); + table_.setModel(modelData_); + modelData_.updateEditorAndRenderer(table_); + // Gestion des erreurs + setErrorText(modelData_.getErrorMessage()); + modelData_.addTableModelModeleAdapterErrorListener(new TableModelModeleAdapterErrorListener() { + public void modeleAdapterError(String _message) { + setErrorText(_message); + } + public void modeleAdpaterNoError() { + setErrorText(""); + } + }); + // Container des \xE9l\xE9ments en dessous du tableau + Container footCont=new Container(); + footCont.setLayout(new BorderLayout()); + // Construction des boutons de d\xE9placement des points + Container btCont=new Container(); + btCont.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); + BuButton btUp_=new BuButton(BuResource.BU.getIcon(EbliLib.getS("monter"))); + btUp_.setToolTipText(EbliLib.getS("D\xE9cr\xE9menter l'index du point")); + BuButton btDown_=new BuButton(BuResource.BU.getIcon(EbliLib.getS("descendre"))); + btDown_.setToolTipText(EbliLib.getS("Incr\xE9menter l'index du point")); + btUp_.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] newSelection=modelData_.movePoints(table_.getSelectedRows(), -1); + // R\xE9tablissement de la selection dans le tableau + table_.getSelectionModel().clearSelection(); + for(int i=0;i<newSelection.length;i++) + table_.getSelectionModel().addSelectionInterval(newSelection[i], newSelection[i]); + } + }); + btDown_.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] newSelection=modelData_.movePoints(table_.getSelectedRows(), 1); + // R\xE9tablissement de la selection dans le tableau + table_.getSelectionModel().clearSelection(); + for(int i=0;i<newSelection.length;i++) + table_.getSelectionModel().addSelectionInterval(newSelection[i], newSelection[i]); + } + }); + btCont.add(new BuLabel(EbliLib.getS("Changement de l'ordre des points selection\xE9s : "))); + btCont.add(btUp_); + btCont.add(btDown_); + footCont.add(btCont, BuBorderLayout.WEST); + // CheckBox permettant de changer le mode d'application des changements + modeChangement_=new BuCheckBox(EbliLib.getS("Mode diff\xE9r\xE9")); + modeChangement_.setToolTipText(EbliLib.getS("<html>En mode diff\xE9r\xE9 : les actions ne sont appliqu\xE9es qu'\xE0 la fin.<br>En mode imm\xE9diat : les actions sont appliqu\xE9es imm\xE9diatement.</html>")); + modeChangement_.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + if(modeChangement_.isSelected()) + modelData_.setDeferedModifications(true); + else + modelData_.setDeferedModifications(false); + } + }); + footCont.add(modeChangement_, BuBorderLayout.EAST); + add(footCont, BuBorderLayout.SOUTH); // Ajout des \xE9l\xE9ments \xE0 l'interface add(new BuScrollPane(table_), BuBorderLayout.CENTER); } } - + /** * @return la s\xE9quence des coordonn\xE9es modifi\xE9es. */ protected CoordinateSequence getNewCoordinate() { - // Cas o\xF9 on a repr\xE9sent\xE9 un ensemble de points - if (isTableStat_) - return ((EbliAtomicCoordinatesTableModel.Line)model_).getNewCoordinateSequence(); // Cas o\xF9 on a repr\xE9sent\xE9 un point unique - else if (zone_.isGeomModifiable()) { + if (zone_.isGeomModifiable()) { Double newX=null, newY=null; if (!xyFormatter_.isEmpty(tfX_)&&!xyFormatter_.isEmpty(tfY_)) newX=(Double)xyFormatter_.getValue(tfX_); @@ -185,30 +248,28 @@ /** * Enregistre les modifications effectu\xE9es. */ - public void apply() { + public void apply(CtuluCommandContainer cmd) { boolean modification=false; // true si une modification a \xE9t\xE9 faite - // Cr\xE9ation d'une nouvelle commande - final CtuluCommandComposite cmp=(cmd_==null ? null:new CtuluCommandComposite()); // Application des modifications des attributs globaux for (int i=globalAttr_.length-1; i>=0; i--) { final Object val=globalAttrEditor_[i].getValue(globalComp_[i]); // Si une modificatin a \xE9t\xE9 faite, modification est mis \xE0 true, sauf si // cette modification est faite sur ETAT_GEOM modification = modification||(!val.equals(globalAttr_[i].getObjectValueAt(idx_))&&globalAttr_[i].getAttribute()!=GISAttributeConstants.ETAT_GEOM); - globalAttr_[i].setObject(idx_, val, cmp); - + if(!globalAttr_[i].getObjectValueAt(idx_).equals(val)&&globalAttr_[i].getAttribute()!=GISAttributeConstants.ETAT_GEOM) + globalAttr_[i].setObject(idx_, val, cmd); } // Cas du tableau modifi\xE9 - if (isTableStat_){ - if(model_.isModified()){ - modification = true; - model_.apply(cmp); - } + if (isTableStat_) { + CtuluCommandContainer c=modelData_.getUndoRedoContainer(); + modelData_.setUndoRedoContainer(cmd); + modelData_.flushData(); + modelData_.setUndoRedoContainer(c); } // Cas du point unique modifi\xE9 else if (zone_.isGeomModifiable()&&!zone_.getCoordinateSequence(idx_).equals(getNewCoordinate())){ modification=true; - zone_.setCoordinateSequence(idx_, getNewCoordinate(), cmp); + zone_.setCoordinateSequence(idx_, getNewCoordinate(), cmd); } // Si une modification a \xE9t\xE9 faite, l'attribut 'Etat' de la g\xE9om\xE9trie passe \xE0 modifi\xE9 if (modification) { @@ -217,11 +278,8 @@ while (!found&&++i<globalAttr_.length) found=globalAttr_[i].getAttribute()==GISAttributeConstants.ETAT_GEOM; if(found) - globalAttr_[i].setObject(idx_, GISAttributeConstants.ATT_VAL_ETAT_MODI, cmp); + globalAttr_[i].setObject(idx_, GISAttributeConstants.ATT_VAL_ETAT_MODI, cmd); } - // Ajout de la nouvelle commande \xE0 cmd_ - if (cmd_!=null) - cmd_.addCmd(cmp.getSimplify()); } /** @@ -259,32 +317,17 @@ */ public LimitedTableRepresentation(EbliFormatterInterface _xyFormatter){ xyFormatter_=_xyFormatter; - model_.addTableModelListener(this); + modelData_.addTableModelListener(this); } - /* - * (non-Javadoc) - * - * @see javax.swing.table.TableModel#getColumnCount() - */ public int getColumnCount() { return 2; } - /* - * (non-Javadoc) - * - * @see javax.swing.table.TableModel#getRowCount() - */ public int getRowCount() { - return model_.getRowCount(); + return modelData_.getRowCount(); } - /* - * (non-Javadoc) - * - * @see javax.swing.table.TableModel#getValueAt(int, int) - */ public Object getValueAt(int _rowIndex, int _columnIndex) { switch (_columnIndex) { case 0: @@ -299,7 +342,7 @@ public boolean isCellEditable(final int _rowIndex, final int _columnIndex) { if (_columnIndex == 0) return false; - return model_.isCellEditable(_rowIndex, _columnIndex); + return modelData_.isCellEditable(_rowIndex, _columnIndex); } public void setValueAt(final Object _value, final int _rowIndex, final int _columnIndex) { @@ -312,15 +355,12 @@ case 0: return EbliLib.getS(EbliLib.getS("Abscisse")); case 1: - return model_.getColumnName(zCol_); + return modelData_.getColumnName(zCol_); default: return null; } } - /* (non-Javadoc) - * @see javax.swing.event.TableModelListener#tableChanged(javax.swing.event.TableModelEvent) - */ public void tableChanged(TableModelEvent _e) { int col=_e.getColumn(); if (_e.getColumn()==zCol_) @@ -348,10 +388,13 @@ private CtuluTable tableauVue_; // Selection update private boolean disable; + /** Indice de la colonne z. */ + protected int zCol_; public CourbeRepresentation() { disable = false; - model_.addTableModelListener(this); + zCol_=zone_.getIndiceOf(zone_.getAttributeIsZ())+3; // l'index + les colonnes index, x et y + modelData_.addTableModelListener(this); // Construction de la courbe \\ setPreferredSize(new Dimension(650,450)); EGGrapheSimpleModel grapheModel=new EGGrapheSimpleModel(); @@ -365,7 +408,7 @@ // Axe des Y axeY_=new EGAxeVertical(); axeY_.setGraduations(true); - axeY_.setTitre(EbliLib.getS("Ordonn\xE9e") + " : " + model_.getColumnName(zCol_)); + axeY_.setTitre(EbliLib.getS("Ordonn\xE9e") + " : " + modelData_.getColumnName(zCol_)); axeY_.setUnite(EbliLib.getS("m\xE8tre")); DecimalFormat df=CtuluLib.getDecimalFormat(); df.setMaximumFractionDigits(2); @@ -400,13 +443,13 @@ } } // Construction du tableau \\ - LimitedTableRepresentation tableau = new LimitedTableRepresentation(model_.xyFormatter_); + LimitedTableRepresentation tableau = new LimitedTableRepresentation(modelData_.getFormatter()); tableauVue_ = new CtuluTable(); tableauVue_.setModel(tableau); tableauVue_.getSelectionModel().addListSelectionListener(this); // Met le bon \xE9diteurs dans le tableau pour l'attribut z tableauVue_.getColumnModel().getColumn(1) - .setCellEditor(model_.modeles_[zInd_].getAttribute().getEditor().createTableEditorComponent()); + .setCellEditor(zone_.getAttributeIsZ().getEditor().createTableEditorComponent()); // Ajout au panel \\ BuScrollPane scrollPane = new BuScrollPane(tableauVue_); BuPanel left = new BuPanel(); @@ -421,7 +464,7 @@ } public int getNbValues() { - return model_.getRowCount(); + return modelData_.getRowCount(); } public double getX(int _id) { @@ -429,11 +472,11 @@ } public double getY(int _id) { - return (Double)model_.getValueAt(_id, zCol_); + return (Double)modelData_.getValueAt(_id, zCol_); } public void setY(int _id, double _value, CtuluCommandContainer _cmd) { - model_.setValueAt(new Double(_value), _id, zCol_); + modelData_.setValueAt(new Double(_value), _id, zCol_); } /** @@ -451,36 +494,32 @@ double oldLengthPolyligne = lengthPolyligne_; double oldMaxZ = maxZ_; lengthPolyligne_=0; - courbeModelIndCoordX_=new HashMap<Integer, Double>(model_.getRowCount()); - double lastX=Double.parseDouble((String)model_.getValueAt(0, 1)); - double lastY=Double.parseDouble((String)model_.getValueAt(0, 2)); - double currentX, currentY; - // Remplissage et construction des attributs - courbeModelIndCoordX_.put(0, lengthPolyligne_); - maxZ_=getY(0); // Le Y de getY (y de la courbe) est le Z du model - for (int i=1; i<model_.getRowCount(); i++) { - currentX=Double.parseDouble((String)model_.getValueAt(i, 1)); - currentY=Double.parseDouble((String)model_.getValueAt(i, 2)); - lengthPolyligne_+=Math.sqrt(Math.pow(lastX-currentX, 2)+Math.pow(lastY-currentY, 2)); - courbeModelIndCoordX_.put(i, lengthPolyligne_); - maxZ_=Math.max(maxZ_, (Double)model_.getValueAt(i, 3)); - lastX=currentX; - lastY=currentY; + courbeModelIndCoordX_=new HashMap<Integer, Double>(modelData_.getRowCount()); + if (modelData_.getRowCount()>0) { + double lastX=(Double)modelData_.getValueAt(0, 1); + double lastY=(Double)modelData_.getValueAt(0, 2); + double currentX, currentY; + // Remplissage et construction des attributs + courbeModelIndCoordX_.put(0, lengthPolyligne_); + maxZ_=getY(0); // Le Y de getY (y de la courbe) est le Z du model + for (int i=1; i<modelData_.getRowCount(); i++) { + currentX=(Double)modelData_.getValueAt(i, 1); + currentY=(Double)modelData_.getValueAt(i, 2); + lengthPolyligne_+=Math.sqrt(Math.pow(lastX-currentX, 2)+Math.pow(lastY-currentY, 2)); + courbeModelIndCoordX_.put(i, lengthPolyligne_); + maxZ_=Math.max(maxZ_, (Double)modelData_.getValueAt(i, 3)); + lastX=currentX; + lastY=currentY; + } + if (oldLengthPolyligne!=lengthPolyligne_) + axeX_.setBounds(0, lengthPolyligne_); + if (grapheVue_.isAutoRestore()) { + if (oldMaxZ!=maxZ_) + axeY_.setBounds(0, maxZ_); + } } - if(oldLengthPolyligne != lengthPolyligne_) - axeX_.setBounds(0, lengthPolyligne_); - if(grapheVue_.isAutoRestore()){ - if(oldMaxZ != maxZ_) - axeY_.setBounds(0, maxZ_); - } } - /* - * (non-Javadoc) - * - * @seejavax.swing.event.TableModelListener#tableChanged(javax.swing.event. - * TableModelEvent) - */ public void tableChanged(TableModelEvent e) { generateCoordX(); if(grapheVue_.isAutoRestore()) @@ -489,9 +528,6 @@ grapheVue_.fullRepaint(); } - /* (non-Javadoc) - * @see org.fudaa.ctulu.CtuluListSelectionListener#listeSelectionChanged(org.fudaa.ctulu.CtuluListSelectionEvent) - */ public void listeSelectionChanged(CtuluListSelectionEvent _e) { // Un changement de selection a \xE9t\xE9 effectu\xE9 dans la courbe \\ if (!disable) { @@ -508,9 +544,6 @@ } } - /* (non-Javadoc) - * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent) - */ public void valueChanged(ListSelectionEvent _e) { // Un changement de selection a \xE9t\xE9 effectu\xE9 dans le tableau \\ if (!disable) { @@ -542,10 +575,8 @@ private TableRepresentation tableRep_; // Onglet repr\xE9sentant une information sous forme de courbe private CourbeRepresentation courbeRep_; - // Model central pour les deux repr\xE9sentations - private EbliAtomicCoordinatesTableModel model_; - private int zCol_; // Num\xE9ro de la colonne contenant les z dans le model - private int zInd_; // Num\xE9ro de l'index des z dans model_.modeles_ + /** Le modele de donn\xE9es \xE0 utiliser comme model de tabelau */ + protected TableModelModeleAdapter modelData_; // Tableau des attributs globaux private GISAttributeModel[] globalAttr_; // Tableau des editeurs d'attributs, cr\xE9e en utilisant globalAttr_ @@ -561,13 +592,11 @@ * @param _editAttribut * @param _xyFormatter */ - public EbliSingleObjectEditorPanel(final ZModeleEditable _zone, final int _idx, final boolean _editAttribut, + public EbliSingleObjectEditorPanel(final ZModeleEditable _model, final int _idx, final boolean _editAttribut, final boolean _editVertexAttribut, final EbliFormatterInterface _xyFormatter) { - super(); idx_=_idx; - zone_=_zone.getGeomData(); - modeleSrc_=_zone; - zInd_ = -1; + zone_=_model.getGeomData(); + modeleSrc_=_model; // Construction de la table des attributs globaux (globalAttr_) \\ setLayout(new BuBorderLayout()); if (_editAttribut) { @@ -608,33 +637,19 @@ // Contruction du model de donn\xE9es commun aux deux repr\xE9sentations GISAttributeDouble zAttr=zone_.getAttributeIsZ(); if (!(zone_.getGeometry(idx_) instanceof GISPoint)&&zAttr!=null&&zAttr.isAtomicValue()) { - model_=new EbliAtomicCoordinatesTableModel.Line(_xyFormatter, modeleSrc_.getGeomData(), idx_, null, _editVertexAttribut, - modeleSrc_); - boolean found=false; - // Construction de zInd_ - int k=0; - while (!found&&k<model_.modeles_.length) { - found=model_.modeles_[k].getAttribute()==zAttr; - k++; - } - if (found){ // forc\xE9ment vrai parce que zAttr est non null - zInd_=--k; - // construction de zCol_ - zCol_=zInd_+3; // zInd_ + colonne index, x et y - // Gestionnaire d'onglet - tabbedPane_=new JTabbedPane(); - // Les onglets - tableRep_=new TableRepresentation(_editAttribut, _editVertexAttribut, _xyFormatter); - courbeRep_=new CourbeRepresentation(); - // Ajout - tabbedPane_.add(EbliLib.getS("Table"), tableRep_); - tabbedPane_.add(EbliLib.getS("Courbe"), courbeRep_); - add(tabbedPane_, BuBorderLayout.CENTER); - } + modelData_=new TableModelModeleAdapter(modeleSrc_, idx_, _xyFormatter, new CtuluCommandComposite(), _editVertexAttribut); + // Gestionnaire d'onglet + tabbedPane_=new JTabbedPane(); + // Les onglets + tableRep_=new TableRepresentation(_editAttribut, _editVertexAttribut, _xyFormatter); + courbeRep_=new CourbeRepresentation(); + // Ajout + tabbedPane_.add(EbliLib.getS("Table"), tableRep_); + tabbedPane_.add(EbliLib.getS("Courbe"), courbeRep_); + add(tabbedPane_, BuBorderLayout.CENTER); } - if(zInd_ == -1) { - model_=new EbliAtomicCoordinatesTableModel.Line(_xyFormatter, modeleSrc_.getGeomData(), idx_, null, _editVertexAttribut, - modeleSrc_); + if (zone_.getIndiceOf(zAttr)==-1) { + modelData_=new TableModelModeleAdapter(modeleSrc_, idx_, _xyFormatter, new CtuluCommandComposite(), _editVertexAttribut); tableRep_=new TableRepresentation(_editAttribut, _editVertexAttribut, _xyFormatter); add(tableRep_, BuBorderLayout.CENTER); } @@ -662,22 +677,29 @@ public boolean hasTab(){ return tabbedPane_!=null; } - - /** - * @return la s\xE9quence des coordonn\xE9es modifi\xE9es. - */ - protected CoordinateSequence getNewCoordinate() { - return tableRep_.getNewCoordinate(); - } /** * Enregistre les modifications effectu\xE9es. Cette m\xE9thode est automatiquement * appell\xE9e lors du click sur le bouton 'Valider' */ public void apply() { + CtuluCommandComposite cmd=new CtuluCommandComposite("Modifications de la g\xE9om\xE9trie"); if (tableRep_!=null) - tableRep_.apply(); + tableRep_.apply(cmd); + cmd.addCmd(((CtuluCommandComposite) modelData_.getUndoRedoContainer()).getSimplify()); + if(getCmd()!=null) + getCmd().addCmd(cmd.getSimplify()); + // D\xE9active le model + modelData_.setSource(null, -1); } + + @Override + public void cancel() { + super.cancel(); + // D\xE9active le model + modelData_.setSource(null, -1); + ((CtuluCommandComposite) modelData_.getUndoRedoContainer()).undo(); + } public final CtuluCommandContainer getCmd() { return cmd_; @@ -689,20 +711,13 @@ /** * Appell\xE9 lors du click sur le bouton 'valider' pour sortir de la fen\xEAtre. - * Retourne vrai si toutes les modification sont valides. + * Retourne vrai si toutes les modifications sont valides. */ public boolean valide() { if (tableRep_!=null) { tableRep_.stopCellEditing(); - final CoordinateSequence s=getNewCoordinate(); - if (s!=null) { - final CtuluAnalyze ana=new CtuluAnalyze(); - final boolean valide=modeleSrc_.isCoordinateValid(s, ana); - if (!valide) { - setErrorText(ana.getFatalError().getMessage()); - } - return valide; - } + if(modelData_.getErrorMessage()!=null) + return false; } return true; } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditorDefault.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditorDefault.java 2009-01-26 22:59:34 UTC (rev 4404) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditorDefault.java 2009-01-27 14:45:39 UTC (rev 4405) @@ -783,9 +783,8 @@ */ protected void editSingleObject(final ZCalqueEditable _target) { final int idxSelected = ((ZCalqueAffichageDonnees) _target).getLayerSelection().getMaxIndex(); - final boolean editAttribute = true; final EbliSingleObjectEditorPanel ed = new EbliSingleObjectEditorPanel(_target.getModelEditable(), idxSelected, - true, editAttribute, getXYFormatter()); + true, true, getXYFormatter()); ed.setCmd(getMng()); if(ed.hasTab()) ed.setSelectedTab(SingleObjectEditorPanel_selectedTab_); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleLigneBriseeEditable.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleLigneBriseeEditable.java 2009-01-26 22:59:34 UTC (rev 4404) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleLigneBriseeEditable.java 2009-01-27 14:45:39 UTC (rev 4405) @@ -523,8 +523,8 @@ s = GISGeometryFactory.INSTANCE.createLineString(_seq); } if (!s.isValid()) { - _analyze.addFatalError(CtuluLib.getS("La nouvelle ligne bris\xE9e n'est pas valide", - CtuluLibString.TROIS)); + if (_analyze!=null) + _analyze.addFatalError(CtuluLib.getS("La nouvelle ligne bris\xE9e n'est pas valide", CtuluLibString.TROIS)); return false; } return true; Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapter.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapter.java 2009-01-27 14:45:39 UTC (rev 4405) @@ -0,0 +1,819 @@ +/* + * @creation 23 janv. 2009 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2009 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.ebli.commun; + +import java.awt.Component; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.JTable; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableColumnModel; +import javax.swing.table.TableModel; + +import org.fudaa.ctulu.CtuluAnalyze; +import org.fudaa.ctulu.CtuluCommandComposite; +import org.fudaa.ctulu.CtuluCommandContainer; +import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISAttributeInterface; +import org.fudaa.ctulu.gis.GISAttributeModel; +import org.fudaa.ctulu.gis.GISCoordinateSequenceFactory; +import org.fudaa.ctulu.gis.GISZoneCollection; +import org.fudaa.ctulu.gui.CtuluValueEditorI; +import org.fudaa.ebli.calque.ZModelGeometryListener; +import org.fudaa.ebli.calque.ZModeleGeometry; +import org.fudaa.ebli.calque.edition.ZModeleEditable; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.CoordinateSequence; +import com.vividsolutions.jts.geom.Geometry; + +/** + * Cette classe permet d'adapter l'interface d'un ZModeleGeometry sur une + * g\xE9om\xE9trie sp\xE9cifique. C'est \xE0 dire que que l'adapter se greffe sur le mod\xE8le + * et selectionne une des g\xE9om\xE9tries. Toutes les m\xE9thodes propos\xE9 par cette + * interface seront r\xE9alis\xE9 sur cette g\xE9om\xE9trie. + * + * Ce model contient : + * en premi\xE8re colonne : index + * en seconde colonne : x + * en troisi\xE8me colonne : y en + * quatri\xE8me colonne : z (si il existe et qu'il est atomique) + * les autres attributs atomiques dans l'ordre de la GISZoneCollection + * etc... + * + * Deux modes d'application des modifications sont pr\xE9sents : + * - un mode imm\xE9diate : les modifications sont imm\xE9diatements appliqu\xE9s \xE0 la gis. + * - un mode diff\xE9r\xE9 : les modifications sont mises en cache et aplliqu\xE9 quand flushData() est appel\xE9. + * + * Le model se charge de mettre la g\xE9o\xE9mtrie \xE0 'Modifi\xE9' lorsque celle-ci l'est. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class TableModelModeleAdapter implements TableModel { + + /** + * Le renderer des cellules du tableau. + */ + protected class Renderer extends DefaultTableCellRenderer { + + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, + int column) { + if(value instanceof Double) + return super.getTableCellRendererComponent(table, formatter_.getXYFormatter().format((Double) value), isSelected, hasFocus, row, column); + if(value instanceof Boolean) + return table.getDefaultRenderer(Boolean.class).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + } + } + + /** + * Classe interface permettant de faire le lien entre la classe m\xE8re et les + * classes g\xE9rant les \xE9tats sp\xE9cifiques. + * Utilisation du design pattern Stat. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ + protected interface TableModelModeleAdapterEtat { + + public Object getValueAt(int rowIndex, int columnIndex); + public void setValueAt(Object value, int rowIndex, int columnIndex); + + /** + * Inverse la position de deux des points de la g\xE9om\xE9trie. + */ + public void switchPoints(int _idx1, int _idx2, CtuluCommandContainer _cmd); + + /** + * Met \xE0 jour les caches utilis\xE9s dans l'instance. Cette m\xE9thode est + * g\xE9n\xE9ralement utilis\xE9 lors d'une modification de mod\xE8le. + */ + public void updateFromModele(); + + /** + * Applique si n\xE9c\xE9ssaire les modifications en attentes. + */ + public void flushData(); + } + + /** + * R\xE9alise les op\xE9rations imm\xE9diatement sur le Modele. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ + protected class ModificationOnTheFly implements TableModelModeleAdapterEtat { + + public ModificationOnTheFly() { + } + + public Object getValueAt(int rowIndex, int columnIndex) { + switch (columnIndex) { + case 0: + return rowIndex; + case 1: + return coordSeq_.getOrdinate(rowIndex, 0); + case 2: + return coordSeq_.getOrdinate(rowIndex, 1); + default: + return mapColonne_.get(columnIndex).modele.getObjectValueAt(rowIndex); + } + } + + public void setValueAt(Object value, int rowIndex, int columnIndex) { + CtuluCommandComposite cmd=new CtuluCommandComposite(EbliLib.getS("Modification d'une g\xE9om\xE9trie")); + if (columnIndex==1||columnIndex==2) { + putGeomModified(cmd); + clearError(); + // Si la g\xE9om\xE9trie est valide avant et invalide apr\xE8s, on ne fait pas la modif + boolean validBefore=modele_.isCoordinateValid(coordSeq_, null); + double oldValue=coordSeq_.getOrdinate(rowIndex, columnIndex-1); + coordSeq_.setOrdinate(rowIndex, columnIndex-1, (Double) value); + boolean validAfter=modele_.isCoordinateValid(coordSeq_, analyzer_); + if (!validAfter) + fireTableModelModeleAdapterError(); + if(!validAfter&&validBefore) + coordSeq_.setOrdinate(rowIndex, columnIndex-1, oldValue); + else { + zone_.setCoordinateSequence(idxSelected_, coordSeq_, cmd); + coordSeq_=new GISCoordinateSequenceFactory().create(zone_.getCoordinateSequence(idxSelected_)); + } + } + else { + mapColonne_.get(columnIndex).modele.setObject(rowIndex, value, cmd); + // Ce fire ne devrait pas \xEAtre utile, mais il semble que pour certains + // models d'attributs ne sont pas \xE9cout\xE9s par leur GISZoneCollection. + fireTableModelListeners(); + } + if(cmd_!=null) + cmd_.addCmd(cmd.getSimplify()); + } + + public void switchPoints(int _idx1, int _idx2, CtuluCommandContainer _cmd) { + putGeomModified(_cmd); + Coordinate tmp=coordSeq_.getCoordinate(_idx1); + coordSeq_.setOrdinate(_idx1, 0, coordSeq_.getOrdinate(_idx2, 0)); + coordSeq_.setOrdinate(_idx1, 1, coordSeq_.getOrdinate(_idx2, 1)); + coordSeq_.setOrdinate(_idx1, 2, coordSeq_.getOrdinate(_idx2, 2)); + coordSeq_.setOrdinate(_idx2, 0, tmp.x); + coordSeq_.setOrdinate(_idx2, 1, tmp.y); + coordSeq_.setOrdinate(_idx2, 2, tmp.z); + zone_.setCoordinateSequence(idxSelected_, coordSeq_, _cmd); + coordSeq_=new GISCoordinateSequenceFactory().create(zone_.getCoordinateSequence(idxSelected_)); + // Inversion des attributs atomiques + for(Map.Entry<Integer, AttributeInformation> entry:mapColonne_.entrySet()) { + Object value=entry.getValue().modele.getObjectValueAt(_idx1); + entry.getValue().modele.setObject(_idx1, entry.getValue().modele.getObjectValueAt(_idx2), _cmd); + entry.getValue().modele.setObject(_idx2, value, _cmd); + } + } + + public void flushData() {} + + public void updateFromModele() {} + } + + /** + * R\xE9alise les op\xE9rations en diff\xE9r\xE9es sur le Modele. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ + protected class ModificationDefered implements TableModelModeleAdapterEtat { + + // Caches \\ + /** M\xE9morisation des index modifi\xE9s. List (colonnes>1) HashMap (ligne -> value). */ + protected List<HashMap<Integer, Object>> modif_=new ArrayList<HashMap<Integer, Object>>(); + /** CoordinateSequence contenant les valeurs temporaires des x et y. */ + protected CoordinateSequence coordSequenceCache_; + /** Crai si il y a eu une modification. */ + protected boolean modificationDone_; + + public ModificationDefered() { + for(int i=0;i<getColumnCount();i++) + modif_.add(new HashMap<Integer, Object>()); + coordSequenceCache_=new GISCoordinateSequenceFactory().create(coordSeq_); + } + + /** + * Retourne vrai si la valeur est en cache. + */ + private boolean isCache(int _idxRow, int _idxCol) { + if(_idxCol==0||_idxCol==1) + return true; + return modif_.get(_idxCol).containsKey(_idxRow); + } + + /** + * Retourne la valeur si elle est en cache, null sinon. + */ + private Object getCacheValue(int _idxRow, int _idxCol) { + switch (_idxCol) { + case 0: + return coordSequenceCache_.getOrdinate(_idxRow, 0); + case 1: + return coordSequenceCache_.getOrdinate(_idxRow, 1); + default: + return modif_.get(_idxCol).get(_idxRow); + } + } + + /** + * Permet d'enregistrer simplement une valeur en cache. + */ + private void setCacheValue(int _idxRow, int _idxCol, Object _value) { + if (_idxCol==1||_idxCol==2) { + modificationDone_=true; + clearError(); + // Si la g\xE9om\xE9trie est valide avant et invalide apr\xE8s, on annule l'\xE9dition + boolean validBefore=modele_.isCoordinateValid(coordSequenceCache_, null); + double oldValue=coordSequenceCache_.getOrdinate(_idxRow, _idxCol-1); + coordSequenceCache_.setOrdinate(_idxRow, _idxCol-1, (Double) _value); + boolean validAfter=modele_.isCoordinateValid(coordSequenceCache_, analyzer_); + if (!validAfter) + fireTableModelModeleAdapterError(); + if(!validAfter&&validBefore) + coordSequenceCache_.setOrdinate(_idxRow, _idxCol-1, oldValue); + } + else if(_idxCol>2) + modif_.get(_idxCol).put(_idxRow, _value); + } + + public void flushData() { + if (modificationDone_) { + CtuluCommandComposite cmd=new CtuluCommandComposite("Modification d'une g\xE9om\xE9trie"); + zone_.setCoordinateSequence(idxSelected_, coordSequenceCache_, cmd); + coordSeq_=new GISCoordinateSequenceFactory().create(zone_.getCoordinateSequence(idxSelected_)); + coordSequenceCache_=(CoordinateSequence) coordSeq_.clone(); + // Flush les attributs atomiques + for (int i=3; i<modif_.size(); i++) + for (Map.Entry<Integer, Object> entry : modif_.get(i).entrySet()) + mapColonne_.get(i).modele.setObject(entry.getKey(), entry.getValue(), cmd); + putGeomModified(cmd); + modificationDone_=false; + if (cmd_!=null) + cmd_.addCmd(cmd.getSimplify()); + } + } + + public Object getValueAt(int rowIndex, int columnIndex) { + switch (columnIndex) { + case 0: + return rowIndex; + case 1: + return coordSequenceCache_.getOrdinate(rowIndex, 0); + case 2: + return coordSequenceCache_.getOrdinate(rowIndex, 1); + default: + if (isCache(rowIndex, columnIndex)) + return getCacheValue(rowIndex, columnIndex); + return mapColonne_.get(columnIndex).modele.getObjectValueAt(rowIndex); + } + } + + public void setValueAt(Object value, int rowIndex, int columnIndex) { + setCacheValue(rowIndex, columnIndex, value); + fireTableModelListeners(); + } + + public void switchPoints(int _idx1, int _idx2, CtuluCommandContainer _cmd) { + modificationDone_=true; + Coordinate tmp=new Coordinate((Double) getValueAt(_idx1, 1), (Double) getValueAt(_idx1, 2)); + setValueAt(getValueAt(_idx2, 1), _idx1, 1); + setValueAt(getValueAt(_idx2, 2), _idx1, 2); + setValueAt(tmp.x, _idx2, 1); + setValueAt(tmp.y, _idx2, 2); + // Inversion des attributs atomiques + for(Map.Entry<Integer, AttributeInformation> entry:mapColonne_.entrySet()) { + Object valueTmp=getValueAt(_idx1, entry.getKey()); + setValueAt(getValueAt(_idx2, entry.getKey()), _idx1, entry.getKey()); + setValueAt(valueTmp, _idx2, entry.getKey()); + } + fireTableModelListeners(); + } + + public void updateFromModele() { + if(mapColonne_.size()!=modif_.size()-3) { + modif_.clear(); + for(int i=0;i<getColumnCount();i++) + modif_.add(new HashMap<Integer, Object>()); + } + } + } + + /** La ZModeleGeometry contenant la g\xE9om\xE9trie. */ + protected ZModeleEditable modele_; + /** La g\xE9om\xE9trie selectionn\xE9e. */ + protected int idxSelected_; + /** Le CtuluCommandContainer pour g\xE9rer l'undo/redo. */ + protected CtuluCommandContainer cmd_; + /** Le container de listener pour le tableau. */ + protected Set<TableModelListener> listenersTable_=new HashSet<TableModelListener>(); + /** Le container de listener pour les erreurs. */ + protected Set<TableModelModeleAdapterErrorListener> listenersError_=new HashSet<TableModelModeleAdapterErrorListener>(); + /** Le listener de la zone. */ + protected ZModeleGeometryListener modeleListener_=new ZModeleGeometryListener(); + /** Le formatter */ + protected EbliFormatterInterface formatter_; + /** L'\xE9tat actuel de l'instance. */ + protected TableModelModeleAdapterEtat stat_; + /** Container d'erreurs. */ + protected CtuluAnalyze analyzer_; + /** Si \xE0 faux les attributs atomiques ne doivent pas \xEAtre visible. */ + protected boolean showAttributes_; + //Caches \\ + /** La GISZoneCollection contenue dans le mod\xE8le. */ + protected GISZoneCollection zone_; + /** Map contenant pour chaque index de colonne une instance de AttributeInformation. */ + protected Map<Integer, AttributeInformation> mapColonne_=new HashMap<Integer, AttributeInformation>(); + /** La CoordinateSequence de la g\xE9om\xE9trie. */ + protected CoordinateSequence coordSeq_; + /** Vrai si la g\xE9om\xE9trie est d\xE9j\xE0 en 'modifi\xE9'. */ + protected boolean alreadyModified_=false; + /** Nombre de lignes dans le tableau */ + protected int nbRow_; + + /** + * Classe servant simplement \xE0 contenir un AttributeInterface et son indice dans la zone. + */ + protected class AttributeInformation { + public GISAttributeInterface attribute; + public GISAttributeModel modele; + public int index; + public AttributeInformation() {}; + public AttributeInformation(GISAttributeInterface _attribute, GISAttributeModel _modele, int _index) { + attribute=_attribute; + modele=_modele; + index=_index; + } + } + + /** + * L'\xE9couteur de la GISZoneCollection. En cas de modification dans celle-ci, + * les caches sont mises \xE0 jour et un fire est lanc\xE9. + */ + protected class ZModeleGeometryListener implements ZModelGeometryListener { + public void attributeAction(Object _source, int att, GISAttributeInterface _att, int _action) { + updateCaches(); + fireTableModelListeners(); + } + public void attributeValueChangeAction(Object _source, int att, GISAttributeInterface _att, int geom, Object value) { + if(_att==GISAttributeConstants.ETAT_GEOM) + alreadyModified_=false; + updateCaches(); + fireTableModelListeners(); + } + public void geometryAction(Object _source, int geom, Geometry _geom, int _action) { + updateCaches(); + fireTableModelListeners(); + } + } + + /** + * @param _modele + * le modele contenant la g\xE9om\xE9trie. Peut \xEAtre null. + * @param _idxSelected + * l'index de la g\xE9om\xE9trie selectionn\xE9. -1 si aucune de selectionn\xE9. + * @param _formatter + * le formatter des valeurs x et y. Peut \xEAtre null. + * @param _cmd + * le gestionnaire d'undo/redo. Peut \xEAtre null + * @param _showAttributes + * Si faux les attributs atomiques ne seront pas visibles. + * @exception IllegalArgumentException + * si _idxSelected n'appartient pas \xE0 _zone. + */ + public TableModelModeleAdapter(ZModeleEditable _modele, int _idxSelected, EbliFormatterInterface _formatter, CtuluCommandContainer _cmd, boolean _showAttributes) { + if ((_modele==null&&_idxSelected!=-1)||(_modele!=null&&_idxSelected!=-1&&(_idxSelected<0||_idxSelected>=_modele.getNombre()))) + throw new IllegalArgumentException(EbliLib.getS("L'index de g\xE9om\xE9trie n'appartient pas \xE0 la zone.")); + modele_=_modele; + idxSelected_=_idxSelected; + formatter_=_formatter; + cmd_=_cmd; + showAttributes_=_showAttributes; + analyzer_=new CtuluAnalyze(); + if (modele_!=null) + modele_.addModelListener(modeleListener_); + stat_=new ModificationOnTheFly(); + updateCaches(); + } + + /** + * Bloque ou d\xE9bloque la visibilit\xE9 des attributs atomiques. + */ + public void setShowAttributesAtomics(boolean _b) { + if(showAttributes_!=_b) { + showAttributes_=_b; + updateCaches(); + fireTableModelListeners(); + } + } + + /** + * Retourne vrai si les attributs atomiques sont visibles. + */ + public boolean isAtomicsAttributesShowed() { + return showAttributes_; + } + + /** + * Permet de changer la source des donn\xE9es. + * + * @param _modele + * le nouveau modele + * @param _idxSelected + * le nouvelle index + * @exception IllegalArgumentException + * si _idxSelected n'appartient pas \xE0 _zone. + */ + public void setSource(ZModeleEditable _modele, int _idxSelected) { + if ((_modele==null&&_idxSelected!=-1)||(_modele!=null&&_idxSelected!=-1&&(_idxSelected<0||_idxSelected>=modele_.getNombre()))) + throw new IllegalArgumentException(EbliLib.getS("L'index de g\xE9om\xE9trie n'appartient pas \xE0 la zone.")); + if (modele_!=_modele||idxSelected_!=_idxSelected) { + if (modele_!=null) + modele_.removeModelListener(modeleListener_); + modele_=_modele; + if (modele_!=null) + modele_.addModelListener(modeleListener_); + idxSelected_=_idxSelected; + updateCaches(); + fireTableModelListeners(); + } + } + + /** + * Active les modifications en diff\xE9r\xE9es. + * Les modifications en cours sont effetu\xE9es. + */ + public void setDeferedModifications(boolean _active) { + if(_active&&!(stat_ instanceof ModificationDefered)) { + stat_.flushData(); + stat_=new ModificationDefered(); + } + else if(!_active&&!(stat_ instanceof ModificationOnTheFly)) { + stat_.flushData(); + stat_=new ModificationOnTheFly(); + } + } + + /** + * Provoque l'\xE9criture des op\xE9rations en cours. + * Inutile si en mode simultan\xE9. + */ + public void flushData() { + stat_.flushData(); + } + + /** + * Changement de la g\xE9om\xE9trie selectionn\xE9e. + * + * @param _idxselected + * l'index de la g\xE9om\xE9trie + * @exception IllegalArgumentException + * si _idxSelected n'appartient pas \xE0 _zone. + */ + public void setSelectionGeometry(int _idxSelected) { + if (_idxSelected!=-1&&(_idxSelected<0||_idxSelected>=modele_.getNombre())) + throw new IllegalArgumentException(EbliLib.getS("L'index de g\xE9om\xE9trie n'appartient pas \xE0 la zone.")); + if (idxSelected_!=_idxSelected) { + idxSelected_=_idxSelected; + fireTableModelListeners(); + } + } + + /** + * Retourne le formatter utilis\xE9. + */ + public EbliFormatterInterface getFormatter() { + return formatter_; + } + + /** + * Change le formatter utilis\xE9. + */ + public void setFormatter(EbliFormatterInterface _formatter) { + if (formatter_!=_formatter) { + formatter_=_formatter; + fireTableModelListeners(); + } + } + + /** + * Retourne le mod\xE8le contenant les g\xE9o\xE9mtries. + */ + public ZModeleGeometry getModeleDonnees() { + return modele_; + } + + /** + * Retourne l'index de la g\xE9om\xE9trie selectionn\xE9e. + */ + public int getSelectedGeometry() { + return idxSelected_; + } + + /** + * Changement du gestionnaire d'undo/redo. + */ + public void setUndoRedoContainer(CtuluCommandContainer _cmd) { + cmd_=_cmd; + } + + /** + * Retourne le gestionnaire d'undo/redo. + */ + public CtuluCommandContainer getUndoRedoContainer() { + return cmd_; + } + + public void addTableModelListener(TableModelListener l) { + if (l!=null&&!listenersTable_.contains(l)) + listenersTable_.add(l); + } + + public void addTableModelModeleAdapterErrorListener(TableModelModeleAdapterErrorListener l) { + if (l!=null&&!listenersError_.contains(l)) + listenersError_.add(l); + } + + public Class<?> getColumnClass(int columnIndex) { + switch (columnIndex) { + case 0: + return Integer.class; + case 1: + return Double.class; + case 2: + return Double.class; + default: + if(mapColonne_!=null) + return mapColonne_.get(columnIndex).attribute.getDataClass(); + else + return null; + } + } + + public int getColumnCount() { + if(mapColonne_!=null) + // index, x, y et les attributs atomiques + return 3+mapColonne_.size(); + else + return 3; + } + + public String getColumnName(int columnIndex) { + switch (columnIndex) { + case 0: + return EbliLib.getS("Index"); + case 1: + return "x"; + case 2: + return "y"; + default: + if(mapColonne_!=null) + return mapColonne_.get(columnIndex).attribute.getLongName(); + else + return null; + } + } + + public int getRowCount() { + if(zone_!=null&&idxSelected_!=-1) + return nbRow_; + else + return 0; + } + + public Object getValueAt(int rowIndex, int columnIndex) { + if(modele_==null||idxSelected_==-1) + throw new IllegalArgumentException(EbliLib.getS("Aucun modele ou aucune g\xE9om\xE9trie selectionn\xE9e.")); + // Colonne index + if(columnIndex==0) + return rowIndex+1; + // Les autres colonnes + return stat_.getValueAt(rowIndex, columnIndex); + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + if(modele_==null||idxSelected_==-1) + throw new IllegalArgumentException(EbliLib.getS("Aucun modele ou aucune g\xE9om\xE9trie selectionn\xE9e.")); + switch (columnIndex) { + case 0: + return false; + case 1: + return true; + case 2: + return true; + default: + return mapColonne_.get(columnIndex).attribute.isEditable(); + } + } + + public void removeTableModelListener(TableModelListener l) { + if (l!=null&&listenersTable_.contains(l)) + listenersTable_.remove(l); + } + + public void removeTableModelModeleAdapterErrorListener(TableModelModeleAdapterErrorListener l) { + if (l!=null&&listenersError_.contains(l)) + listenersError_.remove(l); + } + + public void setValueAt(Object value, int rowIndex, int columnIndex) { + if(modele_==null||idxSelected_==-1) + throw new IllegalArgumentException(EbliLib.getS("Aucun modele ou aucune g\xE9om\xE9trie selectionn\xE9e.")); + if(!getValueAt(rowIndex, columnIndex).equals(value)&&value!=null) + stat_.setValueAt(value, rowIndex, columnIndex); + } + + /** + * Incr\xE9mente de n les index donn\xE9s. + * Pour d\xE9cr\xE9menter donner un indice n\xE9gatif. + * _idx est modifi\xE9 dans l'op\xE9ration + * @return le tableau des nouveaux index. + */ + public int[] movePoints(int[] _idx, int n) { + if(_idx==null) + throw new IllegalArgumentException(EbliLib.getS("_idx ne doit pas \xEAtre null")); + for (int i=0; i<_idx.length; i++) + if (_idx[i]<0||_idx[i]>=getRowCount()) + throw new IllegalArgumentException(EbliLib.getS("Au moins un des index n'est pas valide.")); + CtuluCommandComposite cmd=new CtuluCommandComposite("Switch points"); + // Tir du tableau en fonction du type d'incr\xE9ment + Arrays.sort(_idx); + if (n>0) + reverse(_idx); + // Incr\xE9ment de chaque index + for (int i=0; i<_idx.length; i++) { + int idx=_idx[i]; + // Si on peut le d\xE9placer + if (idx+n>=0&&idx+n<getRowCount()&&!in(idx+n, _idx)) { + _idx[i]=idx+n; + stat_.switchPoints(idx, idx+n, cmd); + } + } + if (cmd_!=null) + cmd_.addCmd(cmd.getSimplify()); + return _idx; + } + + /** + * Inverse la position de deux des points de la g\xE9om\xE9trie. + */ + public void switchPoints(int _idx1, int _idx2) { + if (_idx1<0||_idx1>=getRowCount()||_idx2<0||_idx2>=getRowCount()) + throw new IllegalArgumentException(EbliLib.getS("Au moins un des deux index n'est pas valide.")); + CtuluCommandComposite cmd=new CtuluCommandComposite(EbliLib.getS("Switch de deux points")); + stat_.switchPoints(_idx1, _idx2, cmd); + if(cmd_!=null) + cmd_.addCmd(cmd.getSimplify()); + } + + /** + * Met \xE0 jour les caches utilis\xE9s dans l'instance. Cette m\xE9thode est + * g\xE9n\xE9ralement utilis\xE9 lors d'une modification de mod\xE8le. + */ + private void updateCaches() { + // Vide les buffers + zone_=null; + mapColonne_.clear(); + coordSeq_=null; + nbRow_=0; + // Mise \xE0 jours des buffers \\ + if (modele_!=null) { + // Mise \xE0 jour de zone_ \\ + zone_=modele_.getGeomData(); + // Mise \xE0 jour du nombre de lignes \\ + nbRow_=zone_.getGeometry(idxSelected_).getNumPoints(); + if (showAttributes_) { + // Mise \xE0 jour de mapColonne \\ + int idxColonne=3; + GISAttributeInterface attrZ=zone_.getAttributeIsZ(); + // Cas particulier : attribut z atomique + if (attrZ!=null&&attrZ.isAtomicValue()) { + int idxAttr=zone_.getIndiceOf(attrZ); + mapColonne_.put(idxColonne++, new AttributeInformation(attrZ, (GISAttributeModel)zone_.getValue(idxAttr, idxSelected_), + idxAttr)); + } + // Le reste des attributs + for (int i=0; i<zone_.getNbAttributes(); i++) { + GISAttributeInterface attribute=zone_.getAttribute(i); + if (attribute.isAtomicValue()&&(attrZ==null||attrZ!=attribute)) { + int idxAttr=zone_.getIndiceOf(attribute); + mapColonne_.put(idxColonne++, new AttributeInformation(attribute, (GISAttributeModel)zone_.getValue(idxAttr, + idxSelected_), idxAttr)); + } + } + } + // Mise \xE0 jour du coordinate sequence + coordSeq_=new GISCoordinateSequenceFactory().create(zone_.getCoordinateSequence(idxSelected_)); + } + stat_.updateFromModele(); + } + + /** + * Met les editors et les renderer correcte sur le JTable. + */ + public void updateEditorAndRenderer(JTable _table) { + TableColumnModel cols=_table.getColumnModel(); + Renderer renderer=new Renderer(); + // Renderer \\ + for(int i=0;i<cols.getColumnCount();i++) + cols.getColumn(i).setCellRenderer(renderer); + // Editors \\ + // Colonnes des attributs + if (modele_!=null) { + for (int i=0; i<mapColonne_.size(); i++) { + CtuluValueEditorI editor=mapColonne_.get(3+i).attribute.getEditor(); + if (editor!=null) + cols.getColumn(3+i).setCellEditor(editor.createTableEditorComponent()); + } + } + } + + /** + * Vide le container d'erreur et envoie un \xE9v\xE9nemen si besoin. + */ + private void clearError() { + if(analyzer_.containsFatalError()) { + analyzer_.clear(); + fireTableModelModeleAdapterNoError(); + } + } + + /** + * Retourne un message d'erreur si la g\xE9o\xE9mtrie en cours de cr\xE9ation est + * invalide. + */ + public String getErrorMessage() { + if(modele_.isCoordinateValid(coordSeq_, analyzer_)) + return null; + else + return analyzer_.getFatalError().getMessage(); + } + + protected void fireTableModelListeners() { + for (TableModelListener listener : listenersTable_) + listener.tableChanged(new TableModelEvent(this)); + } + + protected void fireTableModelModeleAdapterNoError() { + for (TableModelModeleAdapterErrorListener listener : listenersError_) + listener.modeleAdpaterNoError(); + } + + protected void fireTableModelModeleAdapterError() { + for (TableModelModeleAdapterErrorListener listener : listenersError_) + listener.modeleAdapterError(analyzer_.getFatalError().getMessage()); + } + + /** + * Met l'\xE9tat de la g\xE9om\xE9trie (GISAttributeConstants.ETAT_GEOM) \xE0 modifi\xE9. + */ + private void putGeomModified(CtuluCommandContainer _cmd) { + if (!alreadyModified_) { + int idxEtatGeom=zone_.getIndiceOf(GISAttributeConstants.ETAT_GEOM); + if (idxEtatGeom!=-1) + zone_.setAttributValue(idxEtatGeom, idxSelected_, GISAttributeConstants.ATT_VAL_ETAT_MODI, _cmd); + alreadyModified_=true; + } + } + + /** + * Retourne vrai si _value est dans _table + * @param _value + * @param _table + * @return + */ + private boolean in(int _value, int[] _table){ + boolean found=false; + int i=-1; + while(!found&&++i<_table.length) + found=_table[i]==_value; + return found; + } + + /** + * Reverse the table. + */ + private void reverse(int[] _table) { + for(int i=0;i<_table.length/2;i++) { + int tmp=_table[i]; + _table[i]=_table[_table.length-i-1]; + _table[_table.length-i-1]=tmp; + } + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapter.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapterErrorListener.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapterErrorListener.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapterErrorListener.java 2009-01-27 14:45:39 UTC (rev 4405) @@ -0,0 +1,26 @@ +/* + * @creation 26 janv. 2009 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2009 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.ebli.commun; + +/** + * Interface d'\xE9coute des erreurs g\xE9n\xE9r\xE9es par TableModelModeleAdapter. + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public interface TableModelModeleAdapterErrorListener { + + /** + * Appel\xE9 quand une erreur est d\xE9tect\xE9 dans les donn\xE9es. + */ + public void modeleAdapterError(String _message); + + /** + * Appel\xE9 quand l'erreur n'a plus de raison d'\xEAtre affich\xE9e. + */ + public void modeleAdpaterNoError(); +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/TableModelModeleAdapterErrorListener.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |