From: <emm...@us...> - 2008-12-18 10:59:30
|
Revision: 4306 http://fudaa.svn.sourceforge.net/fudaa/?rev=4306&view=rev Author: emmanuel_martin Date: 2008-12-18 10:59:27 +0000 (Thu, 18 Dec 2008) Log Message: ----------- Ajout de l'undo/redo dans le modeleur1d. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/Controller1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/DataGeometry.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/DataGeometryAdapter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/MdlFille1d.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/VueCourbe.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/VueTableau.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/test/testModeleur1d/TestDataGeometryAdapter.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/Controller1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/Controller1d.java 2008-12-17 17:44:49 UTC (rev 4305) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/Controller1d.java 2008-12-18 10:59:27 UTC (rev 4306) @@ -20,6 +20,7 @@ import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import org.fudaa.ctulu.CtuluCommandManager; import org.fudaa.ctulu.CtuluListSelectionEvent; import org.fudaa.ctulu.CtuluListSelectionListener; import org.fudaa.ctulu.gis.GISAttributeConstants; @@ -67,6 +68,8 @@ private DataGeometryAdapter dataGeomAdapter_; /** Formater */ private EbliFormatterInterface formater_=new EbliFormatter(); + /** Le commande manager pour le undo/redo */ + private CtuluCommandManager mng_; public Controller1d(MdlImplementation _appli, MdlFille1d _frame1d){ if(_appli==null||_frame1d==null) @@ -74,6 +77,7 @@ appli_=_appli; frame1d_=_frame1d; frame1d_.addInternalFrameListener(this); + mng_=new CtuluCommandManager(); vueBief_=new VueBief(appli_, this); vueBief_.getScene().addSelectionListener(this); treeModel_=vueBief_.getArbreCalqueModel(); @@ -109,6 +113,10 @@ return formater_; } + public CtuluCommandManager getCommandManager(){ + return mng_; + } + // Gestion de l'affichage des erreurs. \\ public void showError(String _message){ Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/DataGeometry.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/DataGeometry.java 2008-12-17 17:44:49 UTC (rev 4305) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/DataGeometry.java 2008-12-18 10:59:27 UTC (rev 4306) @@ -7,6 +7,8 @@ */ package org.fudaa.fudaa.modeleur.modeleur1d; +import org.fudaa.ctulu.CtuluCommandContainer; + /** * Une interface permettant d'acc\xE9der aux informations manipul\xE9es par les * widgets tableau et courbe. @@ -53,14 +55,14 @@ * Pour les autres points, le point 2D est d\xE9plac\xE9 sur son axe en concervant * la longeur globale. */ - public void setCurv(int _idxPoint, double _value) throws DataGeometryException; + public void setCurv(int _idxPoint, double _value, CtuluCommandContainer _cmd) throws DataGeometryException; /** Enregistre la valeur de z du point indiqu\xE9 en param\xE8tre. */ - public void setZ(int _idxPoint, double _value); + public void setZ(int _idxPoint, double _value, CtuluCommandContainer _cmd); /** Enregistre l'abcisse curviligne et la valeur de z du point indiqu\xE9 en param\xE8tre. */ - public void setValues(int _idxPoint, double _valueCurv, double _valueZ) throws DataGeometryException; + public void setValues(int _idxPoint, double _valueCurv, double _valueZ, CtuluCommandContainer _cmd) throws DataGeometryException; /** Supprime le point indiqu\xE9 en param\xE8tre. */ - public void remove(int _idxPoint) throws DataGeometryException; + public void remove(int _idxPoint, CtuluCommandContainer _cmd) throws DataGeometryException; } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/DataGeometryAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/DataGeometryAdapter.java 2008-12-17 17:44:49 UTC (rev 4305) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/DataGeometryAdapter.java 2008-12-18 10:59:27 UTC (rev 4306) @@ -10,7 +10,11 @@ import java.util.ArrayList; import java.util.List; +import org.fudaa.ctulu.CtuluCommand; +import org.fudaa.ctulu.CtuluCommandComposite; +import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluListSelection; +import org.fudaa.ctulu.CtuluNamedCommand; import org.fudaa.ctulu.collection.CtuluCollection; import org.fudaa.ctulu.gis.GISCoordinateSequenceContainerInterface; import org.fudaa.ctulu.gis.GISGeometryFactory; @@ -33,6 +37,62 @@ */ public class DataGeometryAdapter implements DataGeometry { + /** + * Un command container pour le undo/redo. + * Fonctionnement : + * Deux \xE9l\xE9ments sont \xE0 prendre en compte lors du undo/redo : + * 1) Il peut \xEAtre n\xE9c\xE9ssaire de mettre a jour le z et/ou le curv. + * 2) Le undo/redo peut \xEAtre d\xE9clanch\xE9 alors que le DataGeometryAdapter g\xE9re actuellement une autre g\xE9om\xE9try. + * Pour g\xE9rer ces deux cas : + * 1) Deux booleans sont pris par le constructeur indiquant si il faut mettre \xE0 jour les valeurs de z et/ou de curv. + * 2) La zone et l'index de la g\xE9om\xE9trie g\xE9r\xE9 au moment de l'action sont m\xE9moris\xE9s pour g\xE9rer le cas 2. Dans le cas + * o\xF9 un autre g\xE9om\xE9trie est g\xE9r\xE9e au moment du undo/redo aucun update n'est d\xE9clanch\xE9. + * Ainsi m\xEAme si la g\xE9om\xE9trie selectionn\xE9 change plein de fois, revient sur la selection pr\xE9c\xE9dente etc...La mise \xE0 + * jour visuelle se fera correctement. + * Information suppl\xE9mentaire : pour fonctionner correctement le CtuluCommandContainer prit en param\xE8tre contenant + * le undo/redo ne doit pas d\xE9pendre de DataGeometryAdapter mais seulement de la zone. + */ + protected class DGCommandUndoRedo implements CtuluCommand, CtuluNamedCommand { + private CtuluCommand cmd_; + private boolean updateZ_; + private boolean updateCurv_; + private GISZoneCollectionLigneBrisee oldZone_; + private int oldIdxGeom_; + + public DGCommandUndoRedo(CtuluCommand _cmd, boolean _updateZ, boolean _updateCurv){ + cmd_=_cmd; + updateZ_=_updateZ; + updateCurv_=_updateCurv; + oldZone_=zone_; + oldIdxGeom_=idxGeom_; + } + + private void updateIfNeeded(){ + if(oldZone_==zone_&&oldIdxGeom_==idxGeom_) { + if(updateZ_) updateCacheZ(); + if(updateCurv_) updateCacheCurv(); + fireDataGeometryChanged(); + } + } + + public void redo() { + cmd_.redo(); + updateIfNeeded(); + } + + public void undo() { + cmd_.undo(); + updateIfNeeded(); + } + + public String getName() { + if(cmd_ instanceof CtuluNamedCommand) + return ((CtuluNamedCommand) cmd_).getName(); + else + return null; + } + } + private GISZoneCollectionLigneBrisee zone_; private int idxGeom_; private CtuluCollection z_; @@ -50,6 +110,46 @@ } /** + * Met \xE0 jour les valeurs zMin et zMax. + * Si z_ est null, zMin et zMax sont mises \xE0 -1. + */ + protected void updateCacheZ(){ + if(z_!=null) { + idxZMax_=0; + idxZMin_=0; + for (int i=1; i<z_.getSize(); i++) { + double val=(Double)z_.getObjectValueAt(i); + if (val>(Double)z_.getObjectValueAt(idxZMax_)) + idxZMax_=i; + else if (val<(Double)z_.getObjectValueAt(idxZMin_)) + idxZMin_=i; + } + } + else { + idxZMax_=-1; + idxZMin_=-1; + } + } + + /** + * Met \xE0 jour les valeurs curv_. + * Si curv_ ou zone_ sont null, rien n'est fait. + */ + protected void updateCacheCurv(){ + if(curv_!=null&&zone_!=null) { + CoordinateSequence seq=((GISCoordinateSequenceContainerInterface)zone_.getGeometry(idxGeom_)).getCoordinateSequence(); + curv_.clear(); + double curvPre=0; + curv_.add((double)0); + for (int i=1; i<seq.size(); i++) { + double partialCurv=Math.sqrt(Math.pow(seq.getX(i)-seq.getX(i-1), 2)+Math.pow(seq.getY(i)-seq.getY(i-1), 2)); + curvPre=curvPre+partialCurv; + curv_.add(curvPre); + } + } + } + + /** * Permet de choisir la g\xE9om\xE9trie sur lequel l'instance va travailler. * Hypoth\xE8se importante : les points de la g\xE9om\xE9tries sont correctement * ordonn\xE9s (les points sont ordonn\xE9s en ordre croissant de leur abscisse @@ -80,25 +180,10 @@ for (int i=1; i<seq.size(); i++) if (seq.getX(i-1)==seq.getX(i)&&seq.getY(i-1)==seq.getY(i)) throw new DataGeometryException(FudaaLib.getS("Au moins deux points dans le profil sont confondus.")); - // Calcul des acbscisses curvilignes => hypoth\xE8se d'ordonnancement - // correcte des points \\ - double curvPre=0; - curv_.add((double)0); - for (int i=1; i<seq.size(); i++) { - double partialCurv=Math.sqrt(Math.pow(seq.getX(i)-seq.getX(i-1), 2)+Math.pow(seq.getY(i)-seq.getY(i-1), 2)); - curvPre=curvPre+partialCurv; - curv_.add(curvPre); - } + // Calcul des acbscisses curvilignes => hypoth\xE8se d'ordonnancement correcte des points \\ + updateCacheCurv(); // Remplissage du cache Z \\ - idxZMax_=0; - idxZMin_=0; - for (int i=1; i<z_.getSize(); i++) { - double val=(Double)z_.getObjectValueAt(i); - if (val>(Double)z_.getObjectValueAt(idxZMax_)) - idxZMax_=i; - else if (val<(Double)z_.getObjectValueAt(idxZMin_)) - idxZMin_=i; - } + updateCacheZ(); // Verifie que le profil donn\xE9 ne poss\xE8de pas des axes qui se coupent entre eux \\ for(int i=1;i<seq.size();i++){ @@ -212,7 +297,7 @@ return ((Double)z_.getObjectValueAt(_idxPoint)).doubleValue(); } - public void setCurv(int _idxPoint, double _value) throws DataGeometryException { + public void setCurv(int _idxPoint, double _value, CtuluCommandContainer _cmd) throws DataGeometryException { if(curv_==null||_idxPoint<0||_idxPoint>=curv_.size()) // Si curv_!=null alors z et index_ ont des valeurs coh\xE9rentes throw new IllegalArgumentException("Cet index n'existe pas."); // Extraction des coordonn\xE9es de la g\xE9om\xE9trie pour pouvoir les modifier par la suite @@ -324,6 +409,13 @@ * abscisses curvilignes de chacun des points. * Pour y parvenir le nouveau coefficient directeur des axes est calcul\xE9 et appliqu\xE9 au rapport de * l'abcisse curviligne avec l'abscisse du point extr\xE9mit\xE9 de l'axe. + * + * Derni\xE8re petite note pour la fin, le cas dit 'simple' pr\xE9c\xE9dent + * (d\xE9placement d'un point qui n'est pas un point de rupture) n'est qu'un + * cas particulier de la r\xE9solution ci dessus (la solution de l'\xE9quation + * du second degr\xE9 serait unique). On pourrait donc l'enlever, je pense que + * s\xE9parer ces deux cas ne fait pas de mal pour une \xE9ventuelle relecture + * et/ou modification de ce code. */ // Application de la m\xE9thode d\xE9crite ci dessus \\ @@ -460,29 +552,29 @@ } } } - + CtuluCommandComposite cmd=new CtuluCommandComposite("Changement abs. curviligne"); // Enregistrement des nouvelles coordonn\xE9es \\ - zone_.setCoordinateSequence(idxGeom_, GISGeometryFactory.INSTANCE.getCoordinateSequenceFactory().create(coords), null); + zone_.setCoordinateSequence(idxGeom_, GISGeometryFactory.INSTANCE.getCoordinateSequenceFactory().create(coords), cmd); + // Gestion du undo/redo \\ + if(_cmd!=null) + _cmd.addCmd(new DGCommandUndoRedo(cmd, false, true)); // Notification des changements de valeurs fireDataGeometryChanged(); } - public void setZ(int _idxPoint, double _value) { + public void setZ(int _idxPoint, double _value, CtuluCommandContainer _cmd) { if (z_==null||_idxPoint<0||_idxPoint>=z_.getSize()) throw new IllegalArgumentException("Cet index n'existe pas."); - z_.setObject(_idxPoint, _value, null); + + CtuluCommandComposite cmd=new CtuluCommandComposite("Changement abs. curviligne"); + // Mise \xE0 jour du z \\ + z_.setObject(_idxPoint, _value, cmd); + // Gestion du undo/redo \\ + if(_cmd!=null) + _cmd.addCmd(new DGCommandUndoRedo(cmd, true, false)); // Mise \xE0 jour de idxZMin_ et idxZMax_ - if (_idxPoint==idxZMax_||_idxPoint==idxZMin_) { - idxZMax_=0; - idxZMin_=0; - for (int i=1; i<z_.getSize(); i++) { - double val=(Double)z_.getObjectValueAt(i); - if (val>(Double)z_.getObjectValueAt(idxZMax_)) - idxZMax_=i; - else if (val<(Double)z_.getObjectValueAt(idxZMin_)) - idxZMin_=i; - } - } + if (_idxPoint==idxZMax_||_idxPoint==idxZMin_) + updateCacheZ(); else if (_value>(Double)z_.getObjectValueAt(idxZMax_)) idxZMax_=_idxPoint; else if (_value<(Double)z_.getObjectValueAt(idxZMin_)) @@ -518,18 +610,25 @@ return (Double) z_.getObjectValueAt(idxZMin_); } - public void setValues(int _idxPoint, double _valueCurv, double _valueZ) throws DataGeometryException{ - setZ(_idxPoint, _valueZ); - setCurv(_idxPoint, _valueCurv); + public void setValues(int _idxPoint, double _valueCurv, double _valueZ, CtuluCommandContainer _cmd) throws DataGeometryException{ + CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("D\xE9placement d'un point")); + setZ(_idxPoint, _valueZ, cmd); + setCurv(_idxPoint, _valueCurv, cmd); + if(_cmd!=null) + _cmd.addCmd(cmd.getSimplify()); } - public void remove(int _idxPoint) throws DataGeometryException { + public void remove(int _idxPoint, CtuluCommandContainer _cmd) throws DataGeometryException { if(zone_==null||z_==null||curv_==null||_idxPoint<0||_idxPoint>=curv_.size()) throw new IllegalArgumentException("Cet index n'existe pas."); if(curv_.size()==2) throw new DataGeometryException("On ne peut pas enlever un point quand il n'en reste que deux."); + CtuluCommandComposite cmd=new CtuluCommandComposite("Changement abs. curviligne"); // Suppression du point dans la zone - zone_.removeAtomics(idxGeom_, new CtuluListSelection(new int[]{_idxPoint}), null, null); + zone_.removeAtomics(idxGeom_, new CtuluListSelection(new int[]{_idxPoint}), null, cmd); + // Gestion du undo/redo \\ + if(_cmd!=null) + _cmd.addCmd(new DGCommandUndoRedo(cmd, true, true)); z_=(CtuluCollection)zone_.getValue(zone_.getIndiceOf(zone_.getAttributeIsZ()), idxGeom_); // Mise \xE0 jour des informations curvilignes \\ if (_idxPoint==0) { @@ -553,17 +652,8 @@ // Si _idxPoint est le dernier curv_.remove(curv_.size()-1); // Mise \xE0 jour de idxZMin_ et idxZMax_ - if (_idxPoint==idxZMax_||_idxPoint==idxZMin_) { - idxZMax_=0; - idxZMin_=0; - for (int i=1; i<z_.getSize(); i++) { - double val=(Double)z_.getObjectValueAt(i); - if (val>(Double)z_.getObjectValueAt(idxZMax_)) - idxZMax_=i; - else if (val<(Double)z_.getObjectValueAt(idxZMin_)) - idxZMin_=i; - } - } + if (_idxPoint==idxZMax_||_idxPoint==idxZMin_) + updateCacheZ(); fireDataGeometryChanged(); } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/MdlFille1d.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/MdlFille1d.java 2008-12-17 17:44:49 UTC (rev 4305) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/MdlFille1d.java 2008-12-18 10:59:27 UTC (rev 4306) @@ -14,6 +14,8 @@ import javax.swing.JComponent; import javax.swing.JSplitPane; +import org.fudaa.ctulu.CtuluCommandManager; +import org.fudaa.ctulu.CtuluUndoRedoInterface; import org.fudaa.ctulu.gui.CtuluFilleWithComponent; import org.fudaa.ebli.calque.BArbreCalque; import org.fudaa.ebli.impression.EbliFilleImprimable; @@ -22,6 +24,7 @@ import org.fudaa.fudaa.sig.FSigResource; import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuUndoRedoInterface; /** * La fenetre interne vue 2D des donn\xE9es du modeleur. Elle construit le composant arbre de @@ -33,7 +36,7 @@ * @author Emmanuel Martin * @version $Id$ */ -public class MdlFille1d extends EbliFilleImprimable implements CtuluFilleWithComponent { +public class MdlFille1d extends EbliFilleImprimable implements BuUndoRedoInterface, CtuluFilleWithComponent, CtuluUndoRedoInterface { /** Le controller 1d */ private Controller1d controller_; @@ -104,4 +107,22 @@ public JComponent[] getSpecificTools() { return controller_.getToolsActions(); } + + public void redo() { + controller_.getCommandManager().redo(); + } + + public void undo() { + controller_.getCommandManager().undo(); + } + + public void clearCmd(CtuluCommandManager _source) { + } + + public CtuluCommandManager getCmdMng() { + return controller_.getCommandManager(); + } + + public void setActive(boolean _active) { + } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/VueCourbe.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/VueCourbe.java 2008-12-17 17:44:49 UTC (rev 4305) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/VueCourbe.java 2008-12-18 10:59:27 UTC (rev 4306) @@ -19,6 +19,7 @@ import javax.swing.Action; import javax.swing.JComponent; +import org.fudaa.ctulu.CtuluCommandComposite; import org.fudaa.ctulu.CtuluCommandContainer; import org.fudaa.ctulu.CtuluLib; import org.fudaa.ctulu.CtuluListSelectionInterface; @@ -47,6 +48,14 @@ * Cette vue permet la modification et le visionnage d'un profil (pr\xE9alablement * selectionn\xE9 dans la vue du bief). * + * Element important a propos de l'implementation de l'undo/redo : + * une gestion de l'undo/redo est d\xE9j\xE0 pr\xE9sente dans le framework de courbe, + * mais il n'est pas utilis\xE9 pour g\xE9rer l'undo/redo. La raison est qu'il permet + * d'annuler trop d'action (notamment l'ajout de courbe) ce qui peut provoquer + * des comportements incoh\xE9rent dans l'application. C'est pour cette raison que + * tous les undo/redo passent \xE0 la place par le gestionnaire undo/redo du + * controller1d. + * * @author Emmanuel MARTIN * @version $Id$ */ @@ -94,13 +103,18 @@ public boolean deplace(int[] idx, double _deltax, double _deltay, CtuluCommandContainer _cmd) { Arrays.sort(idx); + CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("D\xE9placement d'un ou plusieurs points")); // Selon le sens de d\xE9placement, il faut commencer par le d\xE9but ou la fin du tableau if(_deltax<0) for(int index:idx) - setValue(index, getX(index)+_deltax, getY(index)+_deltay, _cmd); + setValue(index, getX(index)+_deltax, getY(index)+_deltay, cmd); else for(int i=idx.length-1;i>=0;i--) - setValue(idx[i], getX(idx[i])+_deltax, getY(idx[i])+_deltay, _cmd); + setValue(idx[i], getX(idx[i])+_deltax, getY(idx[i])+_deltay, cmd); + if(controller_.getCommandManager()!=null) + // Pour une explication sur l'utilisation de controller_ a la place de + // _cmd voir l'entete de la classe. + controller_.getCommandManager().addCmd(cmd.getSimplify()); return true; } @@ -169,7 +183,9 @@ public boolean removeValue(int _i, CtuluCommandContainer _cmd) { try { - data_.remove(_i); + // Pour une explication sur l'utilisation de controller_ a la place de + // _cmd voir l'entete de la classe. + data_.remove(_i, controller_.getCommandManager()); return true; } catch (DataGeometryException _exc) { @@ -193,7 +209,9 @@ public boolean setValue(int _i, double _x, double _y, CtuluCommandContainer _cmd) { controller_.clearError(); try { - data_.setValues(_i, _x, _y); + // Pour une explication sur l'utilisation de controller_ a la place de + // _cmd voir l'entete de la classe. + data_.setValues(_i, _x, _y, controller_.getCommandManager()); return true; } catch (DataGeometryException _exc) { @@ -203,8 +221,13 @@ } public boolean setValues(int[] _idx, double[] _x, double[] _y, CtuluCommandContainer _cmd) { + CtuluCommandComposite cmd=new CtuluCommandComposite(FudaaLib.getS("D\xE9placement d'un ou plusieurs points")); for(int index: _idx) - setValue(index, _x[index], _y[index], _cmd); + setValue(index, _x[index], _y[index], cmd); + if(controller_.getCommandManager()!=null) + // Pour une explication sur l'utilisation de controller_ a la place de + // _cmd voir l'entete de la classe. + controller_.getCommandManager().addCmd(cmd.getSimplify()); return true; } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/VueTableau.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/VueTableau.java 2008-12-17 17:44:49 UTC (rev 4305) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/modeleur1d/VueTableau.java 2008-12-18 10:59:27 UTC (rev 4306) @@ -85,13 +85,13 @@ controller_.clearError(); if(columnIndex==0) try { - data_.setCurv(rowIndex, (Double) value); + data_.setCurv(rowIndex, (Double) value, controller_.getCommandManager()); } catch (DataGeometryException _exc) { controller_.showError(_exc.getMessage()); } else - data_.setZ(rowIndex, (Double) value); + data_.setZ(rowIndex, (Double) value, controller_.getCommandManager()); } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/test/testModeleur1d/TestDataGeometryAdapter.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/test/testModeleur1d/TestDataGeometryAdapter.java 2008-12-17 17:44:49 UTC (rev 4305) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/test/testModeleur1d/TestDataGeometryAdapter.java 2008-12-18 10:59:27 UTC (rev 4306) @@ -23,7 +23,7 @@ /** * Test pour DataGeometryAdapter. * @author Emmanuel MARTIN - * @version $Id:$ + * @version $Id$ */ public class TestDataGeometryAdapter extends TestCase { @@ -565,46 +565,46 @@ // Cas limits geomAdapter_.setData(null, -1); try{ - geomAdapter_.setCurv(0, 0); + geomAdapter_.setCurv(0, 0, null); fail(); } catch(IllegalArgumentException _exc) {} try{ - geomAdapter_.setCurv(-1, 0); + geomAdapter_.setCurv(-1, 0, null); fail(); } catch(IllegalArgumentException _exc) {} geomAdapter_.setData(zone1_, 0); try{ - geomAdapter_.setCurv(-1, 0); + geomAdapter_.setCurv(-1, 0, null); fail(); } catch(IllegalArgumentException _exc) {} try{ - geomAdapter_.setCurv(zone1_.getGeometry(0).getNumPoints(), 0); + geomAdapter_.setCurv(zone1_.getGeometry(0).getNumPoints(), 0, null); fail(); } catch(IllegalArgumentException _exc) {} try{ - geomAdapter_.setCurv(zone1_.getGeometry(0).getNumPoints()+1, 0); + geomAdapter_.setCurv(zone1_.getGeometry(0).getNumPoints()+1, 0, null); fail(); } catch(IllegalArgumentException _exc) {} // Une abcisse curviligne peut \xEAtre donn\xE9 pour le premier point, seulement pour lui geomAdapter_.setData(zone5_, 0); try{ - geomAdapter_.setCurv(0, -1); + geomAdapter_.setCurv(0, -1, null); } catch(Exception exc){ fail(); } try{ - geomAdapter_.setCurv(1, -1); + geomAdapter_.setCurv(1, -1, null); fail(); } catch(DataGeometryException exc){} try{ - geomAdapter_.setCurv(geomAdapter_.getNbPoint()-1, -1); + geomAdapter_.setCurv(geomAdapter_.getNbPoint()-1, -1, null); fail(); } catch(DataGeometryException exc){} @@ -612,29 +612,29 @@ // Test sur le d\xE9placement d'un point au del\xE0 d'un autre ou au niveau d'un autre geomAdapter_.setData(zone5_, 0); try{ - geomAdapter_.setCurv(0, Math.sqrt(10*10+5*5)+1); + geomAdapter_.setCurv(0, Math.sqrt(10*10+5*5)+1, null); fail(); } catch(DataGeometryException exc){} try{ - geomAdapter_.setCurv(1, 0); + geomAdapter_.setCurv(1, 0, null); fail(); } catch(DataGeometryException exc){} geomAdapter_.setData(zone5_, 6); try{ - geomAdapter_.setCurv(2, geomAdapter_.getCurv(1)-0.1); + geomAdapter_.setCurv(2, geomAdapter_.getCurv(1)-0.1, null); fail(); } catch(DataGeometryException exc){} geomAdapter_.setData(zone5_, 11); try{ // Tentative de se placer sur un point de rupture - geomAdapter_.setCurv(3, geomAdapter_.getCurv(2)); + geomAdapter_.setCurv(3, geomAdapter_.getCurv(2), null); fail(); } catch(DataGeometryException exc){} try{ // Tentative d'un point de rupture de d\xE9pacer un point adjacent - geomAdapter_.setCurv(2, geomAdapter_.getCurv(3)+1); + geomAdapter_.setCurv(2, geomAdapter_.getCurv(3)+1, null); fail(); } catch(DataGeometryException exc){} @@ -643,7 +643,7 @@ // Cas g\xE9n\xE9ral, d\xE9placement d\xE9but geomAdapter_.setData(zone5_, 0); double curvOld=geomAdapter_.getCurv(1); - geomAdapter_.setCurv(0, Math.sqrt(5*5+2.5*2.5)); + geomAdapter_.setCurv(0, Math.sqrt(5*5+2.5*2.5), null); assertEquals(curvOld-Math.sqrt(5*5+2.5*2.5), geomAdapter_.getCurv(1), tolerance); assertEquals(5, zone5_.getGeometry(0).getCoordinates()[0].x, tolerance); assertEquals(2.5, zone5_.getGeometry(0).getCoordinates()[0].y, tolerance); @@ -651,7 +651,7 @@ // Cas g\xE9n\xE9ral, d\xE9placement fin avec point de ruptures geomAdapter_.setData(zone5_, 16); curvOld=geomAdapter_.getCurv(9); - geomAdapter_.setCurv(9, geomAdapter_.getCurv(8)+Math.sqrt((10/4.-10/16.)*(10/4.-10/16.)+(-5/4.+5/16.)*(-5/4.+5/16.))); + geomAdapter_.setCurv(9, geomAdapter_.getCurv(8)+Math.sqrt((10/4.-10/16.)*(10/4.-10/16.)+(-5/4.+5/16.)*(-5/4.+5/16.)), null); assertEquals(geomAdapter_.getCurv(8)+Math.sqrt((10/4.-10/16.)*(10/4.-10/16.)+(-5/4.+5/16.)*(-5/4.+5/16.)), geomAdapter_.getCurv(9), tolerance); assertEquals(10/16., zone5_.getGeometry(16).getCoordinates()[9].x, tolerance); assertEquals(-5/16., zone5_.getGeometry(16).getCoordinates()[9].y, tolerance); @@ -659,7 +659,7 @@ // Cas particulier parall\xE8le \xE0 l'axe des x geomAdapter_.setData(zone5_, 1); curvOld=geomAdapter_.getCurv(1); - geomAdapter_.setCurv(0, -5); + geomAdapter_.setCurv(0, -5, null); assertEquals(curvOld+5, geomAdapter_.getCurv(1), tolerance); assertEquals(0, zone5_.getGeometry(1).getCoordinates()[0].x, tolerance); assertEquals(10, zone5_.getGeometry(1).getCoordinates()[0].y, tolerance); @@ -667,7 +667,7 @@ // Cas particulier parall\xE8le \xE0 l'axe des y geomAdapter_.setData(zone5_, 8); curvOld=geomAdapter_.getCurv(2); - geomAdapter_.setCurv(0, -5); + geomAdapter_.setCurv(0, -5, null); assertEquals(curvOld+5, geomAdapter_.getCurv(2), tolerance); assertEquals(-9.1, zone5_.getGeometry(8).getCoordinates()[0].x, tolerance); assertEquals(93, zone5_.getGeometry(8).getCoordinates()[0].y, tolerance); @@ -677,7 +677,7 @@ geomAdapter_.setData(zone5_, 4); curvOld=geomAdapter_.getCurv(1); double curvOld2=geomAdapter_.getCurv(2); - geomAdapter_.setCurv(1, geomAdapter_.getCurv(1)-5); + geomAdapter_.setCurv(1, geomAdapter_.getCurv(1)-5, null); assertEquals(curvOld-5, geomAdapter_.getCurv(1), tolerance); assertEquals(curvOld2, geomAdapter_.getCurv(2), tolerance); assertEquals(15, zone5_.getGeometry(4).getCoordinates()[1].x, tolerance); @@ -687,7 +687,7 @@ geomAdapter_.setData(zone5_, 15); curvOld=geomAdapter_.getCurv(3); curvOld2=geomAdapter_.getCurv(1); - geomAdapter_.setCurv(3, geomAdapter_.getCurv(3)-2); + geomAdapter_.setCurv(3, geomAdapter_.getCurv(3)-2, null); assertEquals(curvOld-2, geomAdapter_.getCurv(3), tolerance); assertEquals(curvOld2, geomAdapter_.getCurv(1), tolerance); assertEquals(10, zone5_.getGeometry(15).getCoordinates()[3].x, tolerance); @@ -700,7 +700,7 @@ double[] absCurv=new double[6]; for(int i=0;i<6;i++) absCurv[i]=geomAdapter_.getCurv(i); - geomAdapter_.setCurv(2,geomAdapter_.getCurv(2)-2); + geomAdapter_.setCurv(2,geomAdapter_.getCurv(2)-2, null); absCurv[2]=absCurv[2]-2; // R\xE9instancier un nouvel adapter va verifier si il n'y a pas de nouveaux points de ruptures qui sont apparux ou qu'il y ai pas des axes qui se croisent DataGeometryAdapter testAdapter=null; @@ -717,7 +717,7 @@ setUp(); // Test sur les coordonn\xE9es g\xE9n\xE9r\xE9es geomAdapter_.setData(zone1_, 0); - geomAdapter_.setCurv(1, 5); + geomAdapter_.setCurv(1, 5, null); assertEquals(5.0, geomAdapter_.getCurv(1), tolerance); Coordinate p=((GISPolyligne)zone1_.getGeometry(0)).getCoordinateSequence().getCoordinate(1); assertEquals(3.1013705223595296, p.x, tolerance); @@ -726,24 +726,24 @@ public void testSetZ() throws IllegalArgumentException, DataGeometryException { geomAdapter_.setData(zone0_, 0); - geomAdapter_.setZ(0, 20); + geomAdapter_.setZ(0, 20, null); assertEquals(20, geomAdapter_.getZ(0), tolerance); - geomAdapter_.setZ(2, -2); + geomAdapter_.setZ(2, -2, null); assertEquals(-2, geomAdapter_.getZ(2), tolerance); // Cas limits try{ - geomAdapter_.setZ(-11, -2); + geomAdapter_.setZ(-11, -2, null); fail(); }catch(IllegalArgumentException _exc){} try { - geomAdapter_.setZ(1000, -2); + geomAdapter_.setZ(1000, -2, null); fail(); } catch (IllegalArgumentException _exc){} // Cas limits geomAdapter_.setData(null, -1); try { - geomAdapter_.setZ(0, 10); + geomAdapter_.setZ(0, 10, null); fail(); } catch(IllegalArgumentException _exc){} @@ -768,9 +768,9 @@ assertEquals(10, geomAdapter_.getZMax(), tolerance); geomAdapter_.setData(zone1_, 0); assertEquals(0, geomAdapter_.getZMax(), tolerance); - geomAdapter_.setZ(0, 20); + geomAdapter_.setZ(0, 20, null); assertEquals(20, geomAdapter_.getZMax(), tolerance); - geomAdapter_.setZ(0, -5); + geomAdapter_.setZ(0, -5, null); assertEquals(0, geomAdapter_.getZMax(), tolerance); } @@ -779,9 +779,9 @@ assertEquals(-20, geomAdapter_.getZMin(), tolerance); geomAdapter_.setData(zone1_, 0); assertEquals(0, geomAdapter_.getZMin(), tolerance); - geomAdapter_.setZ(0, -20); + geomAdapter_.setZ(0, -20, null); assertEquals(-20, geomAdapter_.getZMin(), tolerance); - geomAdapter_.setZ(0, 10); + geomAdapter_.setZ(0, 10, null); assertEquals(0, geomAdapter_.getZMin(), tolerance); } @@ -791,7 +791,7 @@ double[] absCurv=new double[6]; for(int i=0;i<6;i++) absCurv[i]=geomAdapter_.getCurv(i); - geomAdapter_.setValues(2,geomAdapter_.getCurv(2)-2, 60); + geomAdapter_.setValues(2,geomAdapter_.getCurv(2)-2, 60, null); assertEquals(60, geomAdapter_.getZ(2), tolerance); absCurv[2]=absCurv[2]-2; // R\xE9instancier un nouvel adapter va verifier si il n'y a pas de nouveaux points de ruptures qui sont apparux ou qu'il y ai pas des axes qui se croisent @@ -811,14 +811,14 @@ public void testRemove() throws IllegalArgumentException, DataGeometryException { // Un cas g\xE9n\xE9ral geomAdapter_.setData(zone0_, 0); - geomAdapter_.remove(0); + geomAdapter_.remove(0, null); assertEquals(2, geomAdapter_.getNbPoint()); assertEquals(-20, geomAdapter_.getZ(0), tolerance); assertEquals(0, geomAdapter_.getCurv(0), tolerance); assertEquals(Math.sqrt((50+10)*(50+10)+(10+20)*(10+20)), geomAdapter_.getCurv(1), tolerance); // On ne peut pas descendre en dessous de 2 points try { - geomAdapter_.remove(0); + geomAdapter_.remove(0, null); fail(); } catch(DataGeometryException _exc){ @@ -827,15 +827,15 @@ // Cas limits geomAdapter_.setData(null, -1); try { - geomAdapter_.remove(0); + geomAdapter_.remove(0, null); fail(); } catch(IllegalArgumentException _exc){} // Un cas g\xE9n\xE9ral geomAdapter_.setData(zone3_, 1); - geomAdapter_.remove(4); - geomAdapter_.remove(2); - geomAdapter_.remove(1); + geomAdapter_.remove(4, null); + geomAdapter_.remove(2, null); + geomAdapter_.remove(1, null); assertEquals(2, geomAdapter_.getNbPoint()); assertEquals(0, geomAdapter_.getZ(0), tolerance); assertEquals(0, geomAdapter_.getCurv(0), tolerance); @@ -861,13 +861,13 @@ assertTrue(listener.callNewGeom); listener.callNewGeom=false; // Test dataGeometryChanged - geomAdapter_.setZ(0, 10); + geomAdapter_.setZ(0, 10, null); assertTrue(listener.callChanged); listener.callChanged=false; - geomAdapter_.setCurv(1, (geomAdapter_.getCurv(2)-geomAdapter_.getCurv(0))/2); + geomAdapter_.setCurv(1, (geomAdapter_.getCurv(2)-geomAdapter_.getCurv(0))/2, null); assertTrue(listener.callChanged); listener.callChanged=false; - geomAdapter_.setValues(0, 0, 20); + geomAdapter_.setValues(0, 0, 20, null); assertTrue(listener.callChanged); listener.callChanged=false; try { @@ -896,13 +896,13 @@ assertFalse(listener.callNewGeom); listener.callNewGeom=false; // Test dataGeometryChanged - geomAdapter_.setZ(0, 10); + geomAdapter_.setZ(0, 10, null); assertFalse(listener.callChanged); listener.callChanged=false; - geomAdapter_.setCurv(1, (geomAdapter_.getCurv(2)-geomAdapter_.getCurv(0))/2); + geomAdapter_.setCurv(1, (geomAdapter_.getCurv(2)-geomAdapter_.getCurv(0))/2, null); assertFalse(listener.callChanged); listener.callChanged=false; - geomAdapter_.setValues(0, 0, 20); + geomAdapter_.setValues(0, 0, 20, null); assertFalse(listener.callChanged); listener.callChanged=false; try { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |