From: <emm...@us...> - 2008-11-18 17:19:48
|
Revision: 4222 http://fudaa.svn.sourceforge.net/fudaa/?rev=4222&view=rev Author: emmanuel_martin Date: 2008-11-18 17:19:43 +0000 (Tue, 18 Nov 2008) Log Message: ----------- Tache #24 :"Outil de distance inexistant." Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigVisuPanel.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/action/SceneShowDistanceAction.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteDistance.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/ressource/curseur_distance.gif Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/action/SceneShowDistanceAction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/action/SceneShowDistanceAction.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/action/SceneShowDistanceAction.java 2008-11-18 17:19:43 UTC (rev 4222) @@ -0,0 +1,88 @@ +/* + * @creation 17 nov. 2008 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.ebli.calque.action; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.event.InternalFrameEvent; + +import org.fudaa.ebli.calque.BCalqueInteraction; +import org.fudaa.ebli.calque.ZEbliCalquesPanel; +import org.fudaa.ebli.calque.edition.BPaletteDistance; +import org.fudaa.ebli.calque.edition.ZCalqueDistanceInteraction; +import org.fudaa.ebli.calque.edition.ZEditorDefault; +import org.fudaa.ebli.commun.BPalettePanelInterface; +import org.fudaa.ebli.commun.EbliActionPaletteSpecAbstract; +import org.fudaa.ebli.commun.EbliFormatterInterface; +import org.fudaa.ebli.ressource.EbliResource; + +/** + * Une action pour afficher une palette indiquant la distance entre une s\xE9rie de + * points. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class SceneShowDistanceAction extends EbliActionPaletteSpecAbstract implements PropertyChangeListener { + + private ZEbliCalquesPanel calquesPanel_; + // Calque ne fermant pas l'edition \\ + private BCalqueInteraction calqueZoom_; + private BCalqueInteraction calqueDeplacementVue_; + /** Le calque contenant les informations de distance. */ + private ZCalqueDistanceInteraction calqueDistance_; + protected EbliFormatterInterface formatter_; + + public SceneShowDistanceAction(final ZEditorDefault _editor, EbliFormatterInterface _formatter) { + super(EbliResource.EBLI.getString("Distance"), EbliResource.EBLI.getToolIcon("bu_scrollpane_corner"), "PALETTE_DISTANCE"); + formatter_=_formatter; + calquesPanel_=_editor.getPanel(); + calquesPanel_.getController().addPropertyChangeListener("gele", this); + calqueZoom_=calquesPanel_.getController().getCalqueInteraction("cqAGRANDIR"); + calqueDeplacementVue_=calquesPanel_.getController().getCalqueInteraction("cqDEPLACEMENT_VUE-I"); + calqueDistance_=new ZCalqueDistanceInteraction(); + calqueDistance_.setGele(true); + calquesPanel_.addCalqueInteraction(calqueDistance_); + calqueDistance_.addPropertyChangeListener("gele", this); + setResizable(true); + setEnabled(true); + } + + @Override + public void changeAction() { + super.changeAction(); + if (isSelected()) + calquesPanel_.setCalqueInteractionActif(calqueDistance_); + else{ + calqueDistance_.cancelEdition(); + calquesPanel_.unsetCalqueInteractionActif(calqueDistance_); + if (calquesPanel_.getController().getCqSelectionI()!=null) + calquesPanel_.getController().getCqSelectionI().setGele(false); + } + } + + protected BPalettePanelInterface buildPaletteContent() { + return new BPaletteDistance(calqueDistance_, formatter_, calquesPanel_); + } + + public void propertyChange(PropertyChangeEvent _evt) { + // Cas un autre calque que celui du zoom, du deplacement de vue et d'edition + // est d\xE9gel\xE9 donc on ferme le pannel d'edition si il \xE9tait ouvert. + if (_evt.getSource()!=calqueZoom_&&_evt.getSource()!=calqueDeplacementVue_&&_evt.getSource()!=calqueDistance_ + &&!((Boolean)_evt.getNewValue()).booleanValue()) { + calqueDistance_.cancelEdition(); + } + } + + public void internalFrameClosing(InternalFrameEvent e) { + calqueDistance_.cancelEdition(); + if (calquesPanel_.getController().getCqSelectionI()!=null) + calquesPanel_.getController().getCqSelectionI().setGele(false); + } +} \ No newline at end of file Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/action/SceneShowDistanceAction.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteDistance.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteDistance.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteDistance.java 2008-11-18 17:19:43 UTC (rev 4222) @@ -0,0 +1,110 @@ +/* + * @creation 18 nov. 2008 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.ebli.calque.edition; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.BorderFactory; +import javax.swing.JComponent; + +import org.fudaa.ebli.calque.ZEbliCalquesPanel; +import org.fudaa.ebli.commun.BPalettePanelInterface; +import org.fudaa.ebli.commun.EbliFormatterInterface; +import org.fudaa.ebli.commun.EbliLib; + +import com.memoire.bu.BuButton; +import com.memoire.bu.BuLabel; +import com.memoire.bu.BuPanel; + +/** + * Palette affichant les informations de distances. + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class BPaletteDistance extends BuPanel implements ActionListener, BPalettePanelInterface, PropertyChangeListener { + + /** Label affichant la distance cumul\xE9e. */ + protected BuLabel lblDistanceCumulee_=new BuLabel(); + /** Label affichant la distance en cours. */ + protected BuLabel lblDistanceEnCours_=new BuLabel(); + /** Le calque qui contient les informations de distance. */ + protected ZCalqueDistanceInteraction calqueDistance_; + /** Le bouton 'continuer'. */ + protected BuButton btContinuer_=new BuButton(EbliLib.getS("Continuer")); + protected EbliFormatterInterface formatter_; + private ZEbliCalquesPanel calquesPanel_; + + public BPaletteDistance(ZCalqueDistanceInteraction _calqueDistance, EbliFormatterInterface _formatter, ZEbliCalquesPanel _calquesPanel){ + calquesPanel_=_calquesPanel; + calqueDistance_=_calqueDistance; + calqueDistance_.addDistanceChangeListener(this); + calqueDistance_.addPropertyChangeListener("gele", this); + formatter_=_formatter; + // Construction du panel \\ + setLayout(new BorderLayout()); + // Titre + BuLabel lblTitre=new BuLabel("<html><b>"+EbliLib.getS("Distance")+"</b></html>"); + lblTitre.setHorizontalAlignment(BuLabel.CENTER); + add(lblTitre, BorderLayout.NORTH); + // Contenu + Container body=new Container(); + body.setLayout(new GridLayout(2, 2, 2, 2)); + body.add(new BuLabel("En cours : ")); + body.add(lblDistanceEnCours_); + body.add(new BuLabel("Cumul\xE9e : ")); + body.add(lblDistanceCumulee_); + add(body, BorderLayout.CENTER); + // Bouton reprise + add(btContinuer_, BorderLayout.SOUTH); + btContinuer_.addActionListener(this); + // Affichage + setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); + setVisible(true); + // Valeurs \\ + updateValues(); + } + + /** Met \xE0 jours les valeurs des labels de distance. */ + protected void updateValues(){ + lblDistanceEnCours_.setText(formatter_.getXYFormatter().format(calqueDistance_.getDistanceVariable())); + lblDistanceCumulee_.setText(formatter_.getXYFormatter().format(calqueDistance_.getDistanceCumulee())); + } + + public JComponent getComponent() { + return this; + } + + public boolean setPalettePanelTarget(Object _target) { + return false; + } + + public void paletteDeactivated() {} + + public void doAfterDisplay() {} + + public void propertyChange(PropertyChangeEvent evt) { + if(evt.getPropertyName().equals("gele")) + btContinuer_.setEnabled((Boolean) evt.getNewValue()); + else if(evt.getPropertyName().equals("distance")) + updateValues(); + } + + /* (non-Javadoc) + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ + public void actionPerformed(ActionEvent e) { + calquesPanel_.setCalqueInteractionActif(calqueDistance_); + } + +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteDistance.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java 2008-11-18 17:19:43 UTC (rev 4222) @@ -0,0 +1,234 @@ +/* + * @creation 17 nov. 2008 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2008 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.ebli.calque.edition; + +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.List; + +import org.fudaa.ebli.calque.BCalqueInteraction; +import org.fudaa.ebli.geometrie.GrPoint; +import org.fudaa.ebli.ressource.EbliResource; +import org.fudaa.ebli.trace.TraceLigne; + +import com.memoire.bu.BuResource; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * Permet de visionner des distances. + * + * @author Emmanuel MARTIN + * @version $Id:$ + */ +public class ZCalqueDistanceInteraction extends BCalqueInteraction implements MouseListener, MouseMotionListener { + + /** Liste des points composant le chemin affich\xE9. Se sont des coordonn\xE9s r\xE9els. */ + protected List<Coordinate> chemin_=new ArrayList<Coordinate>(); + /** La coordonn\xE9e correspondant \xE0 la position de la souris. C'est une coordonn\xE9s \xE9cran. */ + protected Coordinate coordSouris_=new Coordinate(); + /** Indique si un chemin est dessin\xE9 \xE0 l'\xE9cran. */ + private boolean cheminIsPaint_=false; + /** Indique si la partie variable (du dernier point \xE0 la souris) est dessin\xE9e \xE0 l'\xE9cran. */ + private boolean variableIsPaint_=false; + /** Traceur de ligne. */ + private TraceLigne traceLigne_=new TraceLigne(TraceLigne.LISSE, 1.5f, Color.RED); + /** Indique si la saisie du chemin est termin\xE9e. */ + protected boolean cheminComplet_=false; + /** Indique si la touche 'CTRL' est active. */ + protected boolean ctrlActif_=false; + /** Listener des distances. */ + private List<PropertyChangeListener> listeners_=new ArrayList<PropertyChangeListener>(); + + public ZCalqueDistanceInteraction(){ + setName("cqInteractifDistance"); + } + + // M\xE9thodes utilitaires \\ + + /** Converti une coordonn\xE9e reel en coordonn\xE9e \xE9cran. */ + protected Coordinate reelToEcran(Coordinate coord){ + GrPoint tmp=new GrPoint(coord.x, coord.y, 0); + tmp.autoApplique(getVersEcran()); + return new Coordinate(tmp.x_, tmp.y_); + } + + /** Converti une coordonn\xE9e reel en coordonn\xE9e \xE9cran. */ + protected Coordinate ecranToReel(Coordinate coord){ + GrPoint tmp=new GrPoint(coord.x, coord.y, 0); + tmp.autoApplique(getVersReel()); + return new Coordinate(tmp.x_, tmp.y_); + } + + /** Dessine un trait en mode XOR \xE0 l'\xE9cran entre les deux coordonn\xE9es fournies. */ + private void dessineTrait(Graphics2D _g, Coordinate coor1, Coordinate coord2){ + _g.setXORMode(getBackground()); + traceLigne_.dessineTrait(_g, coor1.x, coor1.y, coord2.x, coord2.y); + } + + // M\xE9thodes d\xE9riv\xE9es \\ + + public Cursor getSpecificCursor() { + return EbliResource.EBLI.getCursor("curseur_distance", -1, new Point(2, 2)); + } + + public boolean alwaysPaint() { + return true; + } + + public String getDescription() { + return BuResource.BU.getString("Distance"); + } + + public void paintComponent(final Graphics _g) { + effaceChemin(); + super.paintComponent(_g); + // Affichage du chemin avec le graphics pass\xE9 en param\xE8tre + if(chemin_.size()>1){ + for(int i=1; i<chemin_.size();i++) + dessineTrait((Graphics2D) _g, reelToEcran(chemin_.get(i-1)), reelToEcran(chemin_.get(i))); + cheminIsPaint_=true; + } + } + + // M\xE9thodes de base de dessin du chemin \\ + + /** Dessine tout le chemin \xE0 l'\xE9cran sauf la partie variable (du dernier point \xE0 la souris). */ + protected void afficheChemin(){ + if(!cheminIsPaint_&&chemin_.size()>1){ + for(int i=1; i<chemin_.size();i++) + dessineTrait((Graphics2D) getGraphics(), reelToEcran(chemin_.get(i-1)), reelToEcran(chemin_.get(i))); + cheminIsPaint_=true; + } + } + /** Efface tout le chemin \xE0 l'\xE9cran sauf la partie cariable (du dernier point \xE0 la souris).*/ + protected void effaceChemin(){ + if(cheminIsPaint_&&chemin_.size()>1){ + for(int i=1; i<chemin_.size();i++) + dessineTrait((Graphics2D) getGraphics(), reelToEcran(chemin_.get(i-1)), reelToEcran(chemin_.get(i))); + cheminIsPaint_=false; + } + } + /** Dessine la partie variable (du dernier point \xE0 la souris) \xE0 l'\xE9cran. */ + protected void afficheVariable(){ + if(!variableIsPaint_&&chemin_.size()>=1){ + dessineTrait((Graphics2D) getGraphics(), reelToEcran(chemin_.get(chemin_.size()-1)), coordSouris_); + variableIsPaint_=true; + } + } + /** Efface la partie variable (du dernier point \xE0 la souris) \xE0 l'\xE9cran. */ + protected void effaceVariable(){ + if(variableIsPaint_&&chemin_.size()>=1){ + dessineTrait((Graphics2D) getGraphics(), reelToEcran(chemin_.get(chemin_.size()-1)), coordSouris_); + variableIsPaint_=false; + } + } + + // M\xE9thodes de controle ext\xE9rieur et de r\xE9cup\xE9ration d'informations. \\ + + /** Annule l'\xE9dition en cours. */ + public void cancelEdition() { + effaceChemin(); + effaceVariable(); + chemin_.clear(); + cheminComplet_=true; + repaint(); + } + + /** @return retourne la distance totale. */ + public double getDistanceCumulee(){ + double distance=getDistanceVariable(); + for(int i=1; i<chemin_.size();i++) + distance+=chemin_.get(i-1).distance(chemin_.get(i)); + return distance; + } + + /** @return retourne la distance variable (du dernier point \xE0 la souris). */ + public double getDistanceVariable(){ + if(chemin_.size()>=1) + return chemin_.get(chemin_.size()-1).distance(ecranToReel(coordSouris_)); + else + return 0; + } + + public void addDistanceChangeListener(PropertyChangeListener _listener){ + if(!listeners_.contains(_listener)) + listeners_.add(_listener); + } + + public void removeDistanceChangeListener(PropertyChangeListener _listener){ + if(listeners_.contains(_listener)) + listeners_.remove(_listener); + } + + protected void fireDistanceChangeListener(){ + for(PropertyChangeListener listener:listeners_) + listener.propertyChange(new PropertyChangeEvent(this, "distance", null, null)); + } + + // M\xE9thodes g\xE9rant les \xE9v\xE9nements. \\ + + public void mouseClicked(final MouseEvent _evt) { + } + + public void mouseEntered(final MouseEvent _evt) { + // Affichage du chemin sans XOR pour r\xE9afficher correctement la forme apr\xE8s un d\xE9placement des fen\xEAtre + for(int i=1; i<chemin_.size();i++) + traceLigne_.dessineTrait((Graphics2D) getGraphics(), reelToEcran(chemin_.get(i-1)).x, reelToEcran(chemin_.get(i-1)).y, reelToEcran(chemin_.get(i)).x, reelToEcran(chemin_.get(i)).y); + } + + public void mousePressed(final MouseEvent _evt) { + } + + public void mouseDragged(final MouseEvent _evt) { + mouseMoved(_evt); + } + + public void mouseExited(final MouseEvent _evt) { + effaceVariable(); + } + + /** Met \xE0 jour la partie variable du chemin. */ + public void mouseMoved(final MouseEvent _evt) { + if(!isGele()&&!cheminComplet_){ + effaceVariable(); + coordSouris_.x=_evt.getX(); + coordSouris_.y=_evt.getY(); + afficheVariable(); + fireDistanceChangeListener(); + } + } + + public void mouseReleased(final MouseEvent _evt) { + if (!isGele()&&_evt.getButton()==MouseEvent.BUTTON1) { + effaceChemin(); + effaceVariable(); + coordSouris_.x=_evt.getX(); + coordSouris_.y=_evt.getY(); + // Si le chemin \xE9tait d\xE9j\xE0 complet, on reprend \xE0 0 + if(cheminComplet_){ + chemin_.clear(); + cheminComplet_=false; + repaint(); + } + chemin_.add(ecranToReel(new Coordinate(_evt.getX(), _evt.getY()))); + // Si c'est le dernier point, le chemin est termin\xE9 + cheminComplet_=chemin_.size()>1&&getDistanceCumulee()>0&&(_evt.getClickCount()>=2||_evt.isControlDown()); + afficheChemin(); + fireDistanceChangeListener(); + } + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/ressource/curseur_distance.gif =================================================================== (Binary files differ) Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/ressource/curseur_distance.gif ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: svn:keywords + Id Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigVisuPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigVisuPanel.java 2008-11-17 14:54:27 UTC (rev 4221) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/layer/FSigVisuPanel.java 2008-11-18 17:19:43 UTC (rev 4222) @@ -28,7 +28,7 @@ import org.fudaa.ebli.calque.action.SceneRotationAction; import org.fudaa.ebli.calque.action.SceneSelectNextAction; import org.fudaa.ebli.calque.action.SceneSelectPreviousAction; -import org.fudaa.ebli.calque.action.SceneShowOrientationAction; +import org.fudaa.ebli.calque.action.SceneShowDistanceAction; import org.fudaa.ebli.calque.edition.ZCalqueDeplacement; import org.fudaa.ebli.calque.edition.ZCalqueEditionGroup; import org.fudaa.ebli.calque.edition.ZEditorDefault; @@ -179,6 +179,7 @@ arrayList.add(new SceneRotationAction(getArbreCalqueModel().getTreeSelectionModel(), gisEditor_, gisEditor_.getSceneEditor(),getEbliFormatter())); arrayList.add(new SceneDeplacementAction(getArbreCalqueModel().getTreeSelectionModel(), gisEditor_.getSceneEditor(),getEbliFormatter(), getCalqueDeplacement())); arrayList.add(new EditVisibilityAction(getArbreCalqueModel(), getScene(), mng_)); + arrayList.add(new SceneShowDistanceAction(gisEditor_, getEbliFormatter())); return (EbliActionInterface[]) arrayList.toArray(new EbliActionInterface[arrayList.size()]); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |