From: <bma...@us...> - 2008-11-12 13:33:46
|
Revision: 4209 http://fudaa.svn.sourceforge.net/fudaa/?rev=4209&view=rev Author: bmarchan Date: 2008-11-12 13:33:41 +0000 (Wed, 12 Nov 2008) Log Message: ----------- A nouveau tag FudaaModeleur_0_07 (apr?\195?\168s qq pb de distribution). Added Paths: ----------- tags/FudaaModeleur_0_07/ tags/FudaaModeleur_0_07/fudaa_devel/ctulu/src/com/memoire/bu/crystal_descendre.png tags/FudaaModeleur_0_07/fudaa_devel/ctulu/src/com/memoire/bu/crystal_monter.png tags/FudaaModeleur_0_07/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java Removed Paths: ------------- tags/FudaaModeleur_0_07/fudaa_devel/ctulu/src/com/memoire/bu/crystal22_descendre.png tags/FudaaModeleur_0_07/fudaa_devel/ctulu/src/com/memoire/bu/crystal22_monter.png tags/FudaaModeleur_0_07/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java Property changes on: tags/FudaaModeleur_0_07 ___________________________________________________________________ Added: svn:ignore + eclipse_projects Added: svn:mergeinfo + /branches/Br_FudaaModeleur_TF:3445-3850 /branches/FudaaModeleur_TC1:3861-3891 Deleted: tags/FudaaModeleur_0_07/fudaa_devel/ctulu/src/com/memoire/bu/crystal22_descendre.png =================================================================== (Binary files differ) Deleted: tags/FudaaModeleur_0_07/fudaa_devel/ctulu/src/com/memoire/bu/crystal22_monter.png =================================================================== (Binary files differ) Copied: tags/FudaaModeleur_0_07/fudaa_devel/ctulu/src/com/memoire/bu/crystal_descendre.png (from rev 4207, branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/com/memoire/bu/crystal_descendre.png) =================================================================== (Binary files differ) Copied: tags/FudaaModeleur_0_07/fudaa_devel/ctulu/src/com/memoire/bu/crystal_monter.png (from rev 4207, branches/FudaaModeleur_TC1Bis/fudaa_devel/ctulu/src/com/memoire/bu/crystal_monter.png) =================================================================== (Binary files differ) Deleted: tags/FudaaModeleur_0_07/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java 2008-11-12 11:02:46 UTC (rev 4206) +++ tags/FudaaModeleur_0_07/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java 2008-11-12 13:33:41 UTC (rev 4209) @@ -1,704 +0,0 @@ -/* - * @creation 23 oct. 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.Component; -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.util.ArrayList; -import java.util.Arrays; -import java.util.EventObject; - -import javax.swing.AbstractCellEditor; -import javax.swing.BorderFactory; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JTable; -import javax.swing.SwingConstants; -import javax.swing.UIManager; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.event.TreeModelEvent; -import javax.swing.event.TreeModelListener; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableCellRenderer; - -import org.fudaa.ctulu.CtuluCommandManager; -import org.fudaa.ctulu.gis.GISAttributeConstants; -import org.fudaa.ctulu.gis.GISAttributeInterface; -import org.fudaa.ctulu.gis.GISZoneCollection; -import org.fudaa.ctulu.gui.CtuluTable; -import org.fudaa.ebli.calque.BArbreCalqueModel; -import org.fudaa.ebli.calque.ZModelGeometryListener; -import org.fudaa.ebli.calque.ZScene; -import org.fudaa.ebli.calque.ZSelectionEvent; -import org.fudaa.ebli.calque.ZSelectionListener; -import org.fudaa.ebli.commun.BPalettePanelInterface; -import org.fudaa.ebli.commun.EbliLib; - -import com.memoire.bu.BuBorderLayout; -import com.memoire.bu.BuButton; -import com.memoire.bu.BuCheckBox; -import com.memoire.bu.BuComboBox; -import com.memoire.bu.BuLabel; -import com.memoire.bu.BuPanel; -import com.memoire.bu.BuResource; -import com.memoire.bu.BuScrollPane; -import com.vividsolutions.jts.geom.Geometry; - -/** - * Cette palette a pour but de permettre de modifier la visibilit\xE9 de toutes les - * g\xE9om\xE9tries. Concr\xE8trement un tableau listant les g\xE9om\xE9tries propose de cocher - * ou d\xE9cocher une checkbox correspondant \xE0 la valeur de visibilit\xE9 de la - * g\xE9om\xE9trie et r\xE9percute imm\xE9diatement le changement effectu\xE9. - * - * De plus deux boutons permettent de changer l'ordre des g\xE9om\xE9tries dans le - * tableau et dans le model les contenant. - * - * @author Emmanuel MARTIN - * @version $Id: BPaletteEditVisibility.java 4172 2008-11-05 14:49:55Z - * emmanuel_martin $ - */ -public class BPaletteEditVisibility extends BuPanel implements ListSelectionListener, ZSelectionListener, ZModelGeometryListener, TreeModelListener, BPalettePanelInterface, ActionListener, ChangeListener { - - /** Calques disponible pour l'utilisateur. */ - protected ZCalqueEditable[] calques_; - /** Models en cours d'\xE9coute. */ - protected ZModeleEditable[] listenModels_; - protected final String allCalquesEntry_=EbliLib.getS("Tous les calques"); - /** - * vrai quand une modification de la selection dans le tableau ou dans le - * calque est en cours. Permet d'\xE9viter des r\xE9cursions \xE0 cause des listeners de - * selections. - */ - protected boolean listenSelection=true; - /** Vrai quand la visibilit\xE9 n'est pas en train d'\xEAtre chang\xE9 par le panel. */ - protected boolean listenVisibility=true; - protected CtuluCommandManager cmd_; - protected ZScene scene_; - // Composants graphiques - protected final BuComboBox calque_; - protected boolean onlyInvisible_; - protected final CtuluTable table_; - protected BuButton btUp_; - protected BuButton btDown_; - - /** - * @param _treeModel - * utile pour avoir connaissance de la cr\xE9ation et de la suppression - * de calque. - * @param _scene - * utile pour l'\xE9coute des selections. - */ - public BPaletteEditVisibility(BArbreCalqueModel _treeModel, ZScene _scene, CtuluCommandManager _cmd){ - cmd_=_cmd; - scene_=_scene; - calques_=new ZCalqueEditable[0]; - listenModels_=new ZModeleEditable[0]; - _treeModel.addTreeModelListener(this); - scene_.addSelectionListener(this); - // Configuration du panel \\ - setLayout(new BuBorderLayout()); - setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); - setPreferredSize(new Dimension(210, 350)); - Container headContainer=new Container(); - headContainer.setLayout(new BuBorderLayout(5, 5)); - // Ajout du titre \\ - BuLabel titre=new BuLabel("<html><b>"+EbliLib.getS("Visibilit\xE9")+"</b></html>"); - titre.setHorizontalAlignment(SwingConstants.CENTER); - headContainer.add(titre, BuBorderLayout.NORTH); - // Ajout des composants de configuration \\ - Container config=new Container(); - config.setLayout(new GridLayout(2, 2, 2, 2)); - headContainer.add(config, BuBorderLayout.CENTER); - add(headContainer, BuBorderLayout.NORTH); - // Calque - config.add(new BuLabel(EbliLib.getS("Calque"))); - calque_=new BuComboBox(); - config.add(calque_); - // Only invisible - config.add(new BuLabel(EbliLib.getS("Invisible uniquement"))); - Container cont=new Container(); - cont.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); - BuCheckBox cb=new BuCheckBox("", false); - cont.add(cb); - config.add(cont); - // Ajout du tableau de geom\xE9tries \\ - table_=new CtuluTable(); - table_.getSelectionModel().addListSelectionListener(this); - add(new BuScrollPane(table_), BuBorderLayout.CENTER); - // Ajout des boutons de d\xE9placement des g\xE9om\xE9tries \\ - Container btCont=new Container(); - btCont.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); - btUp_=new BuButton(BuResource.BU.getIcon("crystal22_monter")); - btUp_.setToolTipText(EbliLib.getS("D\xE9cr\xE9menter l'index de la g\xE9om\xE9trie")); - btDown_=new BuButton(BuResource.BU.getIcon("crystal22_descendre")); - btDown_.setToolTipText(EbliLib.getS("Incr\xE9menter l'index de la g\xE9om\xE9trie")); - btUp_.addActionListener(this); - btDown_.addActionListener(this); - btCont.add(btUp_); - btCont.add(btDown_); - add(btCont, BuBorderLayout.SOUTH); - // Ajout des informations \\ - fillCalqueComboBox(); - calque_.addActionListener(this); - cb.addChangeListener(this); - fillTableGeometry(); - updateBtMovement(); - } - - /** - * Le modele de la table qui liste les g\xE9om\xE9tries. Il contient \xE9galement le - * calque d'origine de et l'index de la g\xE9om\xE9trie dans ce calque pour pouvoir - * r\xE9percuter le changement. - * - * @author Emmanuel MARTIN - * @version $Id$ - */ - protected class GeomTableModel extends AbstractTableModel { - - private String[] titreColonnes_; - private Object[][] rows_; - - public GeomTableModel(String[] _titreColonnes, Object[][] _rows){ - if(_titreColonnes.length!=2) - throw new IllegalArgumentException("Il doit y avoir deux titres de colonnes."); - for(int i=0;i<_rows.length;i++) - if(_rows[i].length!=4) - throw new IllegalArgumentException("Au moins une ligne n'a pas exactement 4 informations."); - titreColonnes_=_titreColonnes; - rows_=_rows; - } - - public Class<?> getColumnClass(int columnIndex) { - switch(columnIndex){ - case 0: return String.class; - case 1: return Boolean.class; - default: return null; - } - } - - public int getColumnCount() { - return 2; - } - - public String getColumnName(int columnIndex) { - return titreColonnes_[columnIndex]; - } - - public int getRowCount() { - return rows_.length; - } - - public Object getValueAt(int rowIndex, int columnIndex) { - return rows_[rowIndex][columnIndex]; - } - - public boolean isCellEditable(int rowIndex, int columnIndex) { - return columnIndex==1; - } - - public void setValueAt(Object value, int rowIndex, int columnIndex) { - boolean selected=table_.getSelectionModel().isSelectedIndex(rowIndex); - if(columnIndex==0){ - rows_[rowIndex][columnIndex]=value; - fireTableDataChanged(); - if(selected) - table_.getSelectionModel().addSelectionInterval(rowIndex, rowIndex); - } - else if(columnIndex==1){ - if (rows_[rowIndex][columnIndex]!=value) { - rows_[rowIndex][columnIndex]=value; - changeVisibility((Integer)rows_[rowIndex][3], (ZModeleEditable)rows_[rowIndex][2], (Boolean)rows_[rowIndex][1]); - // Dans le cas o\xF9 on n'affiche que les g\xE9om\xE9tries invisibles, on - // enl\xE8ve celle qu'on passe \xE0 visible. - if (onlyInvisible_&&((Boolean)rows_[rowIndex][1])==true) { - Object[][] newRows=new Object[rows_.length-1][]; - for (int i=0; i<rowIndex; i++) - newRows[i]=rows_[i]; - for (int i=rowIndex+1; i<rows_.length; i++) - newRows[i-1]=rows_[i]; - rows_=newRows; - fireTableDataChanged(); - if (selected) - table_.getSelectionModel().addSelectionInterval(rowIndex, rowIndex); - } - } - } - } - } - - protected class GeomTableRenderer implements TableCellRenderer { - public Component getTableCellRendererComponent(JTable _table, Object _value, boolean _isSelected, boolean _hasFocus, int _row, - int _column) { - Color selectionBackground = UIManager.getColor("Table.selectionBackground"); - JPanel pn=new JPanel(); - pn.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); - if(_isSelected) - pn.setBackground(selectionBackground); - else - pn.setBackground(Color.WHITE); - if (_value instanceof Boolean) { - BuCheckBox cb=new BuCheckBox("", (Boolean)_value); - if(_isSelected) - cb.setBackground(selectionBackground); - else - cb.setBackground(Color.WHITE); - pn.add(cb); - } - else{ - BuLabel lbl =new BuLabel(_value.toString()); - if(_isSelected) - lbl.setBackground(selectionBackground); - else - lbl.setBackground(Color.WHITE); - pn.add(lbl); - } - return pn; - } - } - - protected class GeomTableEditor extends AbstractCellEditor implements TableCellEditor, ChangeListener { - - private boolean value; - /** Compteur d'\xE9v\xE9nement. */ - private int a=1; - - /* (non-Javadoc) - * @see - * javax.swing.table.TableCellEditor#getTableCellEditorComponent(javax.swing - * .JTable, java.lang.Object, boolean, int, int) - */ - public Component getTableCellEditorComponent(JTable _table, Object _value, boolean _isSelected, int _row, int _column) { - value=(Boolean)_value; - JPanel pn=new JPanel(); - pn.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); - pn.setBackground(Color.WHITE); - BuCheckBox cb=new BuCheckBox("", (Boolean)_value); - cb.addChangeListener(this); - cb.setBackground(Color.WHITE); - pn.add(cb); - return pn; - } - - /* (non-Javadoc) - * @see javax.swing.CellEditor#getCellEditorValue() - */ - public Object getCellEditorValue() { - return value; - } - - public boolean shouldSelectCell(EventObject anEvent){ - return false; - } - - /* (non-Javadoc) - * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) - */ - public void stateChanged(ChangeEvent e) { - value=!value; - // Un hack : il semble que la checkbox envoie 5 \xE9v\xE9nements \xE0 chaque click. - // Pour arr\xEAter l'\xE9dition automatiquement au bout d'un click, on teste sur - // le compteur de click. - if(a==0) - stopCellEditing(); - a=(a+1)%5; - } - } - - /** - * Place dans le comboBox de choix des calques les calques qui peuvent \xEAtre - * choisis ainsi que l'entr\xE9e sp\xE9ciale 'tout les calques'. - */ - protected void fillCalqueComboBox(){ - // Changement du contenu de la comboBox - Object selectedItem=calque_.getSelectedItem(); - calque_.removeAllItems(); - // R\xE9cup\xE9ration des calques - calques_=scene_.getEditableLayers(); - // Ajout des noms dans le comboBox - calque_.addItem(allCalquesEntry_); - for(int i=0;i<calques_.length;i++) - calque_.addItem(calques_[i].getTitle()); - if(selectedItem!=null) - calque_.setSelectedItem(selectedItem); - else - calque_.setSelectedIndex(0); - updateListen(); - } - - /** - * Met \xE0 jour l'\xE9coute des models - */ - protected void updateListen(){ - // Suppression de l'\xE9coute de tout les models - for(int i=0;i<listenModels_.length;i++) - listenModels_[i].removeModelListener(this); - // Mise a jour du tableau de listeners - if(calque_.getSelectedItem()==allCalquesEntry_){ - listenModels_=new ZModeleEditable[calques_.length]; - for(int i=0;i<calques_.length;i++) - listenModels_[i]=calques_[i].getModelEditable(); - } - else{ - boolean found=false; - int i=-1; - while(!found&&++i<calques_.length) - found=calques_[i].getTitle().equals(calque_.getSelectedItem()); - if(found) - listenModels_=new ZModeleEditable[]{calques_[i].getModelEditable()}; - else - listenModels_=new ZModeleEditable[0]; - } - // Ajout de l'\xE9coute de tout les calques - for(int i=0;i<listenModels_.length;i++){ - listenModels_[i].addModelListener(this); - } - } - - /** - * Rempli le tableau avec toutes les g\xE9o\xE9mtries contenus dans le calque - * selectionn\xE9 dans combobox. Si la checkbox indiquant que seules les - * g\xE9om\xE9tries invisibles sont affich\xE9s est coch\xE9, cette restriction est prise - * en compte ici. - * Le model du tableau est r\xE9instanc\xE9, donc la s\xE9l\xE9ction est - * perdu, ce qui peut entrainer un comportement non voulu. Il est donc - * recommand\xE9 de n'utiliser cette m\xE9thode que pour le premier remplissage du - * tableau. - */ - protected void fillTableGeometry(){ - listenSelection=false; - // Remplissage du tableau - ArrayList<Object[]> rows=new ArrayList<Object[]>(); - for(int i=0;i<calques_.length;i++){ - if(calques_[i].getTitle().equals(calque_.getSelectedItem())||calque_.getSelectedItem()==allCalquesEntry_){ - ZModeleEditable model = calques_[i].getModelEditable(); - // Extraction des donn\xE9es utiles - GISZoneCollection zone=model.getGeomData(); - int indexTitre=zone.getIndiceOf(GISAttributeConstants.TITRE); - int indexVisibility=zone.getIndiceOf(GISAttributeConstants.VISIBILITE); - if(indexTitre!=-1&&indexVisibility!=-1) - for(int j=0;j<zone.getNbGeometries();j++) - if(!onlyInvisible_||zone.getValue(indexVisibility, j)==GISAttributeConstants.ATT_VAL_FALSE) - if(j<zone.getModel(indexVisibility).getSize()&&j<zone.getModel(indexTitre).getSize()) - rows.add(new Object[]{zone.getValue(indexTitre, j), zone.getValue(indexVisibility, j).equals(GISAttributeConstants.ATT_VAL_TRUE)?true:false, model, scene_.layerId2SceneId(calques_[i], j)}); - } - } - table_.setModel(new GeomTableModel(new String[]{EbliLib.getS("Nom"), EbliLib.getS("Visibilit\xE9")}, rows.toArray(new Object[0][]))); - table_.getColumnModel().getColumn(0).setCellRenderer(new GeomTableRenderer()); - table_.getColumnModel().getColumn(1).setCellRenderer(new GeomTableRenderer()); - table_.getColumnModel().getColumn(1).setPreferredWidth(25); - table_.getColumnModel().getColumn(1).setCellEditor(new GeomTableEditor()); - // Mise \xE0 jour de la selection - updateTableSelection(); - listenSelection=true; - } - - /** - * Cette m\xE9thode effectue un changement de visibilit\xE9 sur la g\xE9om\xE9trie - * indiqu\xE9e en param\xE8tre. - * - * @param _numGeom - * l'index de la g\xE9om\xE9trie dans le calque - * @param _calque - * le calque dans lequel se trouve la g\xE9o\xE9mtrie - * @param _visibility - * la nouvelle valeur de visibilit\xE9 - */ - protected void changeVisibility(int _numGeom, ZModeleEditable _model, boolean _visibility) { - listenVisibility=false; - GISZoneCollection zone=_model.getGeomData(); - int indexVisibility=zone.getIndiceOf(GISAttributeConstants.VISIBILITE); - if (indexVisibility!=-1) - zone.getModel(indexVisibility).setObject(scene_.sceneId2LayerId(_numGeom), _visibility==true ? GISAttributeConstants.ATT_VAL_TRUE:GISAttributeConstants.ATT_VAL_FALSE, cmd_); - listenVisibility=true; - } - - /** - * Met \xE0 jour la selection dans le tableau pour qu'elle corresponde \xE0 la selection dans les calques. - */ - protected void updateTableSelection() { - int[] selection=scene_.getLayerSelection().getSelectedIndex(); - for(int i=0;i<table_.getRowCount();i++) - // Si la g\xE9om\xE9trie n'est pas s\xE9lectionn\xE9e dans le calque mais dans le tableau => d\xE9s\xE9lectionne - if(!in(((Integer) table_.getModel().getValueAt(i, 3)).intValue(), selection)&&table_.getSelectionModel().isSelectedIndex(i)) - table_.getSelectionModel().removeSelectionInterval(i, i); - // Si la g\xE9om\xE9trie est selectionn\xE9 dans le calque mais pas dans le tableau => s\xE9lection - else if(in(((Integer) table_.getModel().getValueAt(i, 3)).intValue(), selection)&&!table_.getSelectionModel().isSelectedIndex(i)) - table_.getSelectionModel().addSelectionInterval(i, i); - } - - /** - * Met \xE0 jour la selection dans le(s) calque(s) pour qu'elle corresponde \xE0 la selection dans le tableau. - */ - protected void updateCalqueSelection() { - // Conversion des indices de lignes selectionn\xE9es en index globals de g\xE9om\xE9tries - int[] selection=table_.getSelectedRows(); - int[] selectedIdx=new int[selection.length]; - for(int i=0;i<selectedIdx.length;i++) - selectedIdx[i]=((Integer) table_.getModel().getValueAt(selection[i], 3)).intValue(); - scene_.setSelection(selectedIdx); - } - - /** - * Active ou d\xE9active les deux boutons de mouvement - */ - protected void updateBtMovement(){ - boolean enableUp=false; - boolean enableDown=false; - if(calque_.getSelectedItem()!=allCalquesEntry_&&table_.getSelectedRowCount()>0){ - // Verification qu'il est possible de d\xE9placer la s\xE9lection vers le haut - int i=0; - while(!enableUp&&++i<table_.getRowCount()) - enableUp=!table_.getSelectionModel().isSelectedIndex(i-1)&&table_.getSelectionModel().isSelectedIndex(i); - // V\xE9rification qu'il est possible de d\xE9placer la selection vers le bas - i=table_.getRowCount()-1; - while(!enableDown&&--i>=0) - enableDown=!table_.getSelectionModel().isSelectedIndex(i+1)&&table_.getSelectionModel().isSelectedIndex(i); - } - btUp_.setEnabled(enableUp); - btDown_.setEnabled(enableDown); - } - - /** - * 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; - } - - /** - * "remonte" d'1 les g\xE9om\xE9tries selectionn\xE9es dans leur calque. C'est \xE0 dire - * que si une g\xE9om\xE9trie \xE9tait \xE0 l'index 6, elle passe \xE0 l'index 5 (l'ancienne - * g\xE9om\xE9trie \xE0 5 passe \xE0 6). - */ - protected void moveUpSelectedGeometies(){ - int[] selection=table_.getSelectedRows(); - ArrayList<Integer> newSelection=new ArrayList<Integer>(); - Arrays.sort(selection); - int lastIndexCompute=-1; - for(int i=0;i<selection.length;i++){ - // Si la place du dessus est libre, on monte - if(selection[i]>0&&(!in(selection[i]-1, selection)||selection[i]-1==lastIndexCompute)){ - newSelection.add(selection[i]-1); - lastIndexCompute=selection[i]; - ZModeleEditable model=(ZModeleEditable) table_.getModel().getValueAt(selection[i], 2); - int indexGeom=((Integer) table_.getModel().getValueAt(selection[i], 3)).intValue(); - model.getGeomData().switchGeometries(scene_.sceneId2LayerId(indexGeom), scene_.sceneId2LayerId(indexGeom-1), cmd_); - } - else - newSelection.add(selection[i]); - } - // R\xE9tablissement de la selection dans le tableau - table_.getSelectionModel().clearSelection(); - for(int i=0;i<newSelection.size();i++) - table_.getSelectionModel().addSelectionInterval(newSelection.get(i), newSelection.get(i)); - } - - /** - * "descend" d'1 les g\xE9om\xE9tries selectionn\xE9es dans leur calque. C'est \xE0 dire - * que si une g\xE9om\xE9trie \xE9tait \xE0 l'index 5, elle passe \xE0 l'index 6 (l'ancienne - * g\xE9om\xE9trie \xE0 6 passe \xE0 5). - */ - protected void moveDownSelectedGeometies(){ - int[] selection=table_.getSelectedRows(); - ArrayList<Integer> newSelection=new ArrayList<Integer>(); - Arrays.sort(selection); - int lastIndexCompute=-1; - for(int i=selection.length-1;i>=0;i--){ - // Si la place du dessous est libre, on descend - if(selection[i]<(table_.getRowCount()-1)&&(!in(selection[i]+1, selection)||selection[i]+1==lastIndexCompute)){ - newSelection.add(selection[i]+1); - lastIndexCompute=selection[i]; - ZModeleEditable model=(ZModeleEditable) table_.getModel().getValueAt(selection[i], 2); - int indexGeom=((Integer) table_.getModel().getValueAt(selection[i], 3)).intValue(); - model.getGeomData().switchGeometries(scene_.sceneId2LayerId(indexGeom), scene_.sceneId2LayerId(indexGeom+1), cmd_); - } - else - newSelection.add(selection[i]); - } - // R\xE9tablissement de la selection dans le tableau - table_.getSelectionModel().clearSelection(); - for(int i=0;i<newSelection.size();i++) - table_.getSelectionModel().addSelectionInterval(newSelection.get(i), newSelection.get(i)); - } - - /** - * Est appel\xE9e par EditVisibilityAction quand la palette est d\xE9couverte. - */ - public void doShow(){ - updateListen(); - fillCalqueComboBox(); - fillTableGeometry(); - updateBtMovement(); - } - - /** - * Est appel\xE9e par EditVisibilityAction quand la palette est cach\xE9e. - */ - public void doHide(){ - // Suppression de l'\xE9coute de tout les calques - for(int i=0;i<listenModels_.length;i++) - listenModels_[i].removeModelListener(this); - // Mise a jour du tableau de listeners - listenModels_=new ZModeleEditable[0]; - } - - /* (non-Javadoc) - * @see org.fudaa.ebli.commun.BPalettePanelInterface#doAfterDisplay() - */ - public void doAfterDisplay() { - } - - /* (non-Javadoc) - * @see org.fudaa.ebli.commun.BPalettePanelInterface#getComponent() - */ - public JComponent getComponent() { - return this; - } - - /* (non-Javadoc) - * @see org.fudaa.ebli.commun.BPalettePanelInterface#paletteDeactivated() - */ - public void paletteDeactivated() { - } - - /* (non-Javadoc) - * @see org.fudaa.ebli.commun.BPalettePanelInterface#setPalettePanelTarget(java.lang.Object) - */ - public boolean setPalettePanelTarget(Object _target) { - return false; - } - - // Changement dans le comboBox des calques ou dans les boutons de d\xE9placements \\ - - public void actionPerformed(ActionEvent e) { - if(e.getSource()==calque_){ - updateListen(); - fillTableGeometry(); - updateBtMovement(); - } - else if(e.getSource()==btUp_) - moveUpSelectedGeometies(); - else if(e.getSource()==btDown_) - moveDownSelectedGeometies(); - } - - //Changement dans le checkBox onlyInvisible \\ - - public void stateChanged(ChangeEvent e) { - onlyInvisible_=!onlyInvisible_; - fillTableGeometry(); - } - - // Changement dans l'arbre des calques \\ - - public void treeNodesChanged(TreeModelEvent e) { - fillCalqueComboBox(); - } - - public void treeNodesInserted(TreeModelEvent e) { - fillCalqueComboBox(); - } - - public void treeNodesRemoved(TreeModelEvent e) { - fillCalqueComboBox(); - } - - public void treeStructureChanged(TreeModelEvent e) { - fillCalqueComboBox(); - } - - // Modification dans le ou les model(s) \xE9cout\xE9(s). - - public void attributeAction(Object _source, int att, GISAttributeInterface _att, int _action) { - fillTableGeometry(); - } - - public void attributeValueChangeAction(Object _source, int att, GISAttributeInterface _att, int _geom, Object _value) { - if(listenVisibility&&(_att==GISAttributeConstants.TITRE||_att==GISAttributeConstants.VISIBILITE||_att==null)){ - // Recherche le calque contenant le model - boolean foundCalque=false; - int j=-1; - ZCalqueEditable[] calques=scene_.getEditableLayers(); - while (!foundCalque&&++j<calques.length) - foundCalque=calques[j].getModelEditable()==_source; - if (foundCalque) { - if (_geom>=0) { - int idxGeom=scene_.layerId2SceneId(calques[j], _geom); - // Mise \xE0 jour seulement de la g\xE9om\xE9trie. - boolean found=false; - int i=-1; - while (!found&&++i<table_.getModel().getRowCount()) { - ZModeleEditable model=(ZModeleEditable)table_.getModel().getValueAt(i, 2); - Integer indexGeom=(Integer)table_.getModel().getValueAt(i, 3); - found=(model==_source)&&(indexGeom==idxGeom); - } - if (found) - if (_att==GISAttributeConstants.TITRE) - table_.getModel().setValueAt(_value, i, 0); - else if (_att==GISAttributeConstants.VISIBILITE) - table_.getModel().setValueAt(_value.equals(GISAttributeConstants.ATT_VAL_TRUE) ? true:false, i, 1); - else { - GISZoneCollection zone=((ZModeleEditable)_source).getGeomData(); - table_.getModel().setValueAt( - ((ZModeleEditable)_source).getGeomData().getValue(zone.getIndiceOf(GISAttributeConstants.TITRE), _geom), i, 0); - table_.getModel().setValueAt( - ((ZModeleEditable)_source).getGeomData().getValue(zone.getIndiceOf(GISAttributeConstants.VISIBILITE), _geom) - .equals(GISAttributeConstants.ATT_VAL_TRUE) ? true:false, i, 1); - } - } - else - // Mise \xE0 jour de toutes les g\xE9om\xE9tries. - fillTableGeometry(); - } - } - } - - public void geometryAction(Object _source, int geom, Geometry _geom, int _action) { - if(_action!=GEOMETRY_ACTION_MODIFY) - fillTableGeometry(); - } - - // La selection dans un calque \xE0 chang\xE9e \\ - - public void selectionChanged(ZSelectionEvent _evt) { - if (listenSelection) { - listenSelection=false; - updateTableSelection(); - updateBtMovement(); - listenSelection=true; - } - } - - // La selection dans le tableau \xE0 chang\xE9e \\ - - public void valueChanged(ListSelectionEvent _e) { - if (listenSelection) { - listenSelection=false; - updateCalqueSelection(); - updateBtMovement(); - listenSelection=true; - } - } -} Copied: tags/FudaaModeleur_0_07/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java (from rev 4207, branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java) =================================================================== --- tags/FudaaModeleur_0_07/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java (rev 0) +++ tags/FudaaModeleur_0_07/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/BPaletteEditVisibility.java 2008-11-12 13:33:41 UTC (rev 4209) @@ -0,0 +1,704 @@ +/* + * @creation 23 oct. 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.Component; +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.util.ArrayList; +import java.util.Arrays; +import java.util.EventObject; + +import javax.swing.AbstractCellEditor; +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.SwingConstants; +import javax.swing.UIManager; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.event.TreeModelEvent; +import javax.swing.event.TreeModelListener; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; + +import org.fudaa.ctulu.CtuluCommandManager; +import org.fudaa.ctulu.gis.GISAttributeConstants; +import org.fudaa.ctulu.gis.GISAttributeInterface; +import org.fudaa.ctulu.gis.GISZoneCollection; +import org.fudaa.ctulu.gui.CtuluTable; +import org.fudaa.ebli.calque.BArbreCalqueModel; +import org.fudaa.ebli.calque.ZModelGeometryListener; +import org.fudaa.ebli.calque.ZScene; +import org.fudaa.ebli.calque.ZSelectionEvent; +import org.fudaa.ebli.calque.ZSelectionListener; +import org.fudaa.ebli.commun.BPalettePanelInterface; +import org.fudaa.ebli.commun.EbliLib; + +import com.memoire.bu.BuBorderLayout; +import com.memoire.bu.BuButton; +import com.memoire.bu.BuCheckBox; +import com.memoire.bu.BuComboBox; +import com.memoire.bu.BuLabel; +import com.memoire.bu.BuPanel; +import com.memoire.bu.BuResource; +import com.memoire.bu.BuScrollPane; +import com.vividsolutions.jts.geom.Geometry; + +/** + * Cette palette a pour but de permettre de modifier la visibilit\xE9 de toutes les + * g\xE9om\xE9tries. Concr\xE8trement un tableau listant les g\xE9om\xE9tries propose de cocher + * ou d\xE9cocher une checkbox correspondant \xE0 la valeur de visibilit\xE9 de la + * g\xE9om\xE9trie et r\xE9percute imm\xE9diatement le changement effectu\xE9. + * + * De plus deux boutons permettent de changer l'ordre des g\xE9om\xE9tries dans le + * tableau et dans le model les contenant. + * + * @author Emmanuel MARTIN + * @version $Id: BPaletteEditVisibility.java 4172 2008-11-05 14:49:55Z + * emmanuel_martin $ + */ +public class BPaletteEditVisibility extends BuPanel implements ListSelectionListener, ZSelectionListener, ZModelGeometryListener, TreeModelListener, BPalettePanelInterface, ActionListener, ChangeListener { + + /** Calques disponible pour l'utilisateur. */ + protected ZCalqueEditable[] calques_; + /** Models en cours d'\xE9coute. */ + protected ZModeleEditable[] listenModels_; + protected final String allCalquesEntry_=EbliLib.getS("Tous les calques"); + /** + * vrai quand une modification de la selection dans le tableau ou dans le + * calque est en cours. Permet d'\xE9viter des r\xE9cursions \xE0 cause des listeners de + * selections. + */ + protected boolean listenSelection=true; + /** Vrai quand la visibilit\xE9 n'est pas en train d'\xEAtre chang\xE9 par le panel. */ + protected boolean listenVisibility=true; + protected CtuluCommandManager cmd_; + protected ZScene scene_; + // Composants graphiques + protected final BuComboBox calque_; + protected boolean onlyInvisible_; + protected final CtuluTable table_; + protected BuButton btUp_; + protected BuButton btDown_; + + /** + * @param _treeModel + * utile pour avoir connaissance de la cr\xE9ation et de la suppression + * de calque. + * @param _scene + * utile pour l'\xE9coute des selections. + */ + public BPaletteEditVisibility(BArbreCalqueModel _treeModel, ZScene _scene, CtuluCommandManager _cmd){ + cmd_=_cmd; + scene_=_scene; + calques_=new ZCalqueEditable[0]; + listenModels_=new ZModeleEditable[0]; + _treeModel.addTreeModelListener(this); + scene_.addSelectionListener(this); + // Configuration du panel \\ + setLayout(new BuBorderLayout()); + setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); + setPreferredSize(new Dimension(210, 350)); + Container headContainer=new Container(); + headContainer.setLayout(new BuBorderLayout(5, 5)); + // Ajout du titre \\ + BuLabel titre=new BuLabel("<html><b>"+EbliLib.getS("Visibilit\xE9")+"</b></html>"); + titre.setHorizontalAlignment(SwingConstants.CENTER); + headContainer.add(titre, BuBorderLayout.NORTH); + // Ajout des composants de configuration \\ + Container config=new Container(); + config.setLayout(new GridLayout(2, 2, 2, 2)); + headContainer.add(config, BuBorderLayout.CENTER); + add(headContainer, BuBorderLayout.NORTH); + // Calque + config.add(new BuLabel(EbliLib.getS("Calque"))); + calque_=new BuComboBox(); + config.add(calque_); + // Only invisible + config.add(new BuLabel(EbliLib.getS("Invisible uniquement"))); + Container cont=new Container(); + cont.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); + BuCheckBox cb=new BuCheckBox("", false); + cont.add(cb); + config.add(cont); + // Ajout du tableau de geom\xE9tries \\ + table_=new CtuluTable(); + table_.getSelectionModel().addListSelectionListener(this); + add(new BuScrollPane(table_), BuBorderLayout.CENTER); + // Ajout des boutons de d\xE9placement des g\xE9om\xE9tries \\ + Container btCont=new Container(); + btCont.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); + btUp_=new BuButton(BuResource.BU.getIcon("monter")); + btUp_.setToolTipText(EbliLib.getS("D\xE9cr\xE9menter l'index de la g\xE9om\xE9trie")); + btDown_=new BuButton(BuResource.BU.getIcon("descendre")); + btDown_.setToolTipText(EbliLib.getS("Incr\xE9menter l'index de la g\xE9om\xE9trie")); + btUp_.addActionListener(this); + btDown_.addActionListener(this); + btCont.add(btUp_); + btCont.add(btDown_); + add(btCont, BuBorderLayout.SOUTH); + // Ajout des informations \\ + fillCalqueComboBox(); + calque_.addActionListener(this); + cb.addChangeListener(this); + fillTableGeometry(); + updateBtMovement(); + } + + /** + * Le modele de la table qui liste les g\xE9om\xE9tries. Il contient \xE9galement le + * calque d'origine de et l'index de la g\xE9om\xE9trie dans ce calque pour pouvoir + * r\xE9percuter le changement. + * + * @author Emmanuel MARTIN + * @version $Id$ + */ + protected class GeomTableModel extends AbstractTableModel { + + private String[] titreColonnes_; + private Object[][] rows_; + + public GeomTableModel(String[] _titreColonnes, Object[][] _rows){ + if(_titreColonnes.length!=2) + throw new IllegalArgumentException("Il doit y avoir deux titres de colonnes."); + for(int i=0;i<_rows.length;i++) + if(_rows[i].length!=4) + throw new IllegalArgumentException("Au moins une ligne n'a pas exactement 4 informations."); + titreColonnes_=_titreColonnes; + rows_=_rows; + } + + public Class<?> getColumnClass(int columnIndex) { + switch(columnIndex){ + case 0: return String.class; + case 1: return Boolean.class; + default: return null; + } + } + + public int getColumnCount() { + return 2; + } + + public String getColumnName(int columnIndex) { + return titreColonnes_[columnIndex]; + } + + public int getRowCount() { + return rows_.length; + } + + public Object getValueAt(int rowIndex, int columnIndex) { + return rows_[rowIndex][columnIndex]; + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex==1; + } + + public void setValueAt(Object value, int rowIndex, int columnIndex) { + boolean selected=table_.getSelectionModel().isSelectedIndex(rowIndex); + if(columnIndex==0){ + rows_[rowIndex][columnIndex]=value; + fireTableDataChanged(); + if(selected) + table_.getSelectionModel().addSelectionInterval(rowIndex, rowIndex); + } + else if(columnIndex==1){ + if (rows_[rowIndex][columnIndex]!=value) { + rows_[rowIndex][columnIndex]=value; + changeVisibility((Integer)rows_[rowIndex][3], (ZModeleEditable)rows_[rowIndex][2], (Boolean)rows_[rowIndex][1]); + // Dans le cas o\xF9 on n'affiche que les g\xE9om\xE9tries invisibles, on + // enl\xE8ve celle qu'on passe \xE0 visible. + if (onlyInvisible_&&((Boolean)rows_[rowIndex][1])==true) { + Object[][] newRows=new Object[rows_.length-1][]; + for (int i=0; i<rowIndex; i++) + newRows[i]=rows_[i]; + for (int i=rowIndex+1; i<rows_.length; i++) + newRows[i-1]=rows_[i]; + rows_=newRows; + fireTableDataChanged(); + if (selected) + table_.getSelectionModel().addSelectionInterval(rowIndex, rowIndex); + } + } + } + } + } + + protected class GeomTableRenderer implements TableCellRenderer { + public Component getTableCellRendererComponent(JTable _table, Object _value, boolean _isSelected, boolean _hasFocus, int _row, + int _column) { + Color selectionBackground = UIManager.getColor("Table.selectionBackground"); + JPanel pn=new JPanel(); + pn.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); + if(_isSelected) + pn.setBackground(selectionBackground); + else + pn.setBackground(Color.WHITE); + if (_value instanceof Boolean) { + BuCheckBox cb=new BuCheckBox("", (Boolean)_value); + if(_isSelected) + cb.setBackground(selectionBackground); + else + cb.setBackground(Color.WHITE); + pn.add(cb); + } + else{ + BuLabel lbl =new BuLabel(_value.toString()); + if(_isSelected) + lbl.setBackground(selectionBackground); + else + lbl.setBackground(Color.WHITE); + pn.add(lbl); + } + return pn; + } + } + + protected class GeomTableEditor extends AbstractCellEditor implements TableCellEditor, ChangeListener { + + private boolean value; + /** Compteur d'\xE9v\xE9nement. */ + private int a=1; + + /* (non-Javadoc) + * @see + * javax.swing.table.TableCellEditor#getTableCellEditorComponent(javax.swing + * .JTable, java.lang.Object, boolean, int, int) + */ + public Component getTableCellEditorComponent(JTable _table, Object _value, boolean _isSelected, int _row, int _column) { + value=(Boolean)_value; + JPanel pn=new JPanel(); + pn.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); + pn.setBackground(Color.WHITE); + BuCheckBox cb=new BuCheckBox("", (Boolean)_value); + cb.addChangeListener(this); + cb.setBackground(Color.WHITE); + pn.add(cb); + return pn; + } + + /* (non-Javadoc) + * @see javax.swing.CellEditor#getCellEditorValue() + */ + public Object getCellEditorValue() { + return value; + } + + public boolean shouldSelectCell(EventObject anEvent){ + return false; + } + + /* (non-Javadoc) + * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) + */ + public void stateChanged(ChangeEvent e) { + value=!value; + // Un hack : il semble que la checkbox envoie 5 \xE9v\xE9nements \xE0 chaque click. + // Pour arr\xEAter l'\xE9dition automatiquement au bout d'un click, on teste sur + // le compteur de click. + if(a==0) + stopCellEditing(); + a=(a+1)%5; + } + } + + /** + * Place dans le comboBox de choix des calques les calques qui peuvent \xEAtre + * choisis ainsi que l'entr\xE9e sp\xE9ciale 'tout les calques'. + */ + protected void fillCalqueComboBox(){ + // Changement du contenu de la comboBox + Object selectedItem=calque_.getSelectedItem(); + calque_.removeAllItems(); + // R\xE9cup\xE9ration des calques + calques_=scene_.getEditableLayers(); + // Ajout des noms dans le comboBox + calque_.addItem(allCalquesEntry_); + for(int i=0;i<calques_.length;i++) + calque_.addItem(calques_[i].getTitle()); + if(selectedItem!=null) + calque_.setSelectedItem(selectedItem); + else + calque_.setSelectedIndex(0); + updateListen(); + } + + /** + * Met \xE0 jour l'\xE9coute des models + */ + protected void updateListen(){ + // Suppression de l'\xE9coute de tout les models + for(int i=0;i<listenModels_.length;i++) + listenModels_[i].removeModelListener(this); + // Mise a jour du tableau de listeners + if(calque_.getSelectedItem()==allCalquesEntry_){ + listenModels_=new ZModeleEditable[calques_.length]; + for(int i=0;i<calques_.length;i++) + listenModels_[i]=calques_[i].getModelEditable(); + } + else{ + boolean found=false; + int i=-1; + while(!found&&++i<calques_.length) + found=calques_[i].getTitle().equals(calque_.getSelectedItem()); + if(found) + listenModels_=new ZModeleEditable[]{calques_[i].getModelEditable()}; + else + listenModels_=new ZModeleEditable[0]; + } + // Ajout de l'\xE9coute de tout les calques + for(int i=0;i<listenModels_.length;i++){ + listenModels_[i].addModelListener(this); + } + } + + /** + * Rempli le tableau avec toutes les g\xE9o\xE9mtries contenus dans le calque + * selectionn\xE9 dans combobox. Si la checkbox indiquant que seules les + * g\xE9om\xE9tries invisibles sont affich\xE9s est coch\xE9, cette restriction est prise + * en compte ici. + * Le model du tableau est r\xE9instanc\xE9, donc la s\xE9l\xE9ction est + * perdu, ce qui peut entrainer un comportement non voulu. Il est donc + * recommand\xE9 de n'utiliser cette m\xE9thode que pour le premier remplissage du + * tableau. + */ + protected void fillTableGeometry(){ + listenSelection=false; + // Remplissage du tableau + ArrayList<Object[]> rows=new ArrayList<Object[]>(); + for(int i=0;i<calques_.length;i++){ + if(calques_[i].getTitle().equals(calque_.getSelectedItem())||calque_.getSelectedItem()==allCalquesEntry_){ + ZModeleEditable model = calques_[i].getModelEditable(); + // Extraction des donn\xE9es utiles + GISZoneCollection zone=model.getGeomData(); + int indexTitre=zone.getIndiceOf(GISAttributeConstants.TITRE); + int indexVisibility=zone.getIndiceOf(GISAttributeConstants.VISIBILITE); + if(indexTitre!=-1&&indexVisibility!=-1) + for(int j=0;j<zone.getNbGeometries();j++) + if(!onlyInvisible_||zone.getValue(indexVisibility, j)==GISAttributeConstants.ATT_VAL_FALSE) + if(j<zone.getModel(indexVisibility).getSize()&&j<zone.getModel(indexTitre).getSize()) + rows.add(new Object[]{zone.getValue(indexTitre, j), zone.getValue(indexVisibility, j).equals(GISAttributeConstants.ATT_VAL_TRUE)?true:false, model, scene_.layerId2SceneId(calques_[i], j)}); + } + } + table_.setModel(new GeomTableModel(new String[]{EbliLib.getS("Nom"), EbliLib.getS("Visibilit\xE9")}, rows.toArray(new Object[0][]))); + table_.getColumnModel().getColumn(0).setCellRenderer(new GeomTableRenderer()); + table_.getColumnModel().getColumn(1).setCellRenderer(new GeomTableRenderer()); + table_.getColumnModel().getColumn(1).setPreferredWidth(25); + table_.getColumnModel().getColumn(1).setCellEditor(new GeomTableEditor()); + // Mise \xE0 jour de la selection + updateTableSelection(); + listenSelection=true; + } + + /** + * Cette m\xE9thode effectue un changement de visibilit\xE9 sur la g\xE9om\xE9trie + * indiqu\xE9e en param\xE8tre. + * + * @param _numGeom + * l'index de la g\xE9om\xE9trie dans le calque + * @param _calque + * le calque dans lequel se trouve la g\xE9o\xE9mtrie + * @param _visibility + * la nouvelle valeur de visibilit\xE9 + */ + protected void changeVisibility(int _numGeom, ZModeleEditable _model, boolean _visibility) { + listenVisibility=false; + GISZoneCollection zone=_model.getGeomData(); + int indexVisibility=zone.getIndiceOf(GISAttributeConstants.VISIBILITE); + if (indexVisibility!=-1) + zone.getModel(indexVisibility).setObject(scene_.sceneId2LayerId(_numGeom), _visibility==true ? GISAttributeConstants.ATT_VAL_TRUE:GISAttributeConstants.ATT_VAL_FALSE, cmd_); + listenVisibility=true; + } + + /** + * Met \xE0 jour la selection dans le tableau pour qu'elle corresponde \xE0 la selection dans les calques. + */ + protected void updateTableSelection() { + int[] selection=scene_.getLayerSelection().getSelectedIndex(); + for(int i=0;i<table_.getRowCount();i++) + // Si la g\xE9om\xE9trie n'est pas s\xE9lectionn\xE9e dans le calque mais dans le tableau => d\xE9s\xE9lectionne + if(!in(((Integer) table_.getModel().getValueAt(i, 3)).intValue(), selection)&&table_.getSelectionModel().isSelectedIndex(i)) + table_.getSelectionModel().removeSelectionInterval(i, i); + // Si la g\xE9om\xE9trie est selectionn\xE9 dans le calque mais pas dans le tableau => s\xE9lection + else if(in(((Integer) table_.getModel().getValueAt(i, 3)).intValue(), selection)&&!table_.getSelectionModel().isSelectedIndex(i)) + table_.getSelectionModel().addSelectionInterval(i, i); + } + + /** + * Met \xE0 jour la selection dans le(s) calque(s) pour qu'elle corresponde \xE0 la selection dans le tableau. + */ + protected void updateCalqueSelection() { + // Conversion des indices de lignes selectionn\xE9es en index globals de g\xE9om\xE9tries + int[] selection=table_.getSelectedRows(); + int[] selectedIdx=new int[selection.length]; + for(int i=0;i<selectedIdx.length;i++) + selectedIdx[i]=((Integer) table_.getModel().getValueAt(selection[i], 3)).intValue(); + scene_.setSelection(selectedIdx); + } + + /** + * Active ou d\xE9active les deux boutons de mouvement + */ + protected void updateBtMovement(){ + boolean enableUp=false; + boolean enableDown=false; + if(calque_.getSelectedItem()!=allCalquesEntry_&&table_.getSelectedRowCount()>0){ + // Verification qu'il est possible de d\xE9placer la s\xE9lection vers le haut + int i=0; + while(!enableUp&&++i<table_.getRowCount()) + enableUp=!table_.getSelectionModel().isSelectedIndex(i-1)&&table_.getSelectionModel().isSelectedIndex(i); + // V\xE9rification qu'il est possible de d\xE9placer la selection vers le bas + i=table_.getRowCount()-1; + while(!enableDown&&--i>=0) + enableDown=!table_.getSelectionModel().isSelectedIndex(i+1)&&table_.getSelectionModel().isSelectedIndex(i); + } + btUp_.setEnabled(enableUp); + btDown_.setEnabled(enableDown); + } + + /** + * 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; + } + + /** + * "remonte" d'1 les g\xE9om\xE9tries selectionn\xE9es dans leur calque. C'est \xE0 dire + * que si une g\xE9om\xE9trie \xE9tait \xE0 l'index 6, elle passe \xE0 l'index 5 (l'ancienne + * g\xE9om\xE9trie \xE0 5 passe \xE0 6). + */ + protected void moveUpSelectedGeometies(){ + int[] selection=table_.getSelectedRows(); + ArrayList<Integer> newSelection=new ArrayList<Integer>(); + Arrays.sort(selection); + int lastIndexCompute=-1; + for(int i=0;i<selection.length;i++){ + // Si la place du dessus est libre, on monte + if(selection[i]>0&&(!in(selection[i]-1, selection)||selection[i]-1==lastIndexCompute)){ + newSelection.add(selection[i]-1); + lastIndexCompute=selection[i]; + ZModeleEditable model=(ZModeleEditable) table_.getModel().getValueAt(selection[i], 2); + int indexGeom=((Integer) table_.getModel().getValueAt(selection[i], 3)).intValue(); + model.getGeomData().switchGeometries(scene_.sceneId2LayerId(indexGeom), scene_.sceneId2LayerId(indexGeom-1), cmd_); + } + else + newSelection.add(selection[i]); + } + // R\xE9tablissement de la selection dans le tableau + table_.getSelectionModel().clearSelection(); + for(int i=0;i<newSelection.size();i++) + table_.getSelectionModel().addSelectionInterval(newSelection.get(i), newSelection.get(i)); + } + + /** + * "descend" d'1 les g\xE9om\xE9tries selectionn\xE9es dans leur calque. C'est \xE0 dire + * que si une g\xE9om\xE9trie \xE9tait \xE0 l'index 5, elle passe \xE0 l'index 6 (l'ancienne + * g\xE9om\xE9trie \xE0 6 passe \xE0 5). + */ + protected void moveDownSelectedGeometies(){ + int[] selection=table_.getSelectedRows(); + ArrayList<Integer> newSelection=new ArrayList<Integer>(); + Arrays.sort(selection); + int lastIndexCompute=-1; + for(int i=selection.length-1;i>=0;i--){ + // Si la place du dessous est libre, on descend + if(selection[i]<(table_.getRowCount()-1)&&(!in(selection[i]+1, selection)||selection[i]+1==lastIndexCompute)){ + newSelection.add(selection[i]+1); + lastIndexCompute=selection[i]; + ZModeleEditable model=(ZModeleEditable) table_.getModel().getValueAt(selection[i], 2); + int indexGeom=((Integer) table_.getModel().getValueAt(selection[i], 3)).intValue(); + model.getGeomData().switchGeometries(scene_.sceneId2LayerId(indexGeom), scene_.sceneId2LayerId(indexGeom+1), cmd_); + } + else + newSelection.add(selection[i]); + } + // R\xE9tablissement de la selection dans le tableau + table_.getSelectionModel().clearSelection(); + for(int i=0;i<newSelection.size();i++) + table_.getSelectionModel().addSelectionInterval(newSelection.get(i), newSelection.get(i)); + } + + /** + * Est appel\xE9e par EditVisibilityAction quand la palette est d\xE9couverte. + */ + public void doShow(){ + updateListen(); + fillCalqueComboBox(); + fillTableGeometry(); + updateBtMovement(); + } + + /** + * Est appel\xE9e par EditVisibilityAction quand la palette est cach\xE9e. + */ + public void doHide(){ + // Suppression de l'\xE9coute de tout les calques + for(int i=0;i<listenModels_.length;i++) + listenModels_[i].removeModelListener(this); + // Mise a jour du tableau de listeners + listenModels_=new ZModeleEditable[0]; + } + + /* (non-Javadoc) + * @see org.fudaa.ebli.commun.BPalettePanelInterface#doAfterDisplay() + */ + public void doAfterDisplay() { + } + + /* (non-Javadoc) + * @see org.fudaa.ebli.commun.BPalettePanelInterface#getComponent() + */ + public JComponent getComponent() { + return this; + } + + /* (non-Javadoc) + * @see org.fudaa.ebli.commun.BPalettePanelInterface#paletteDeactivated() + */ + public void paletteDeactivated() { + } + + /* (non-Javadoc) + * @see org.fudaa.ebli.commun.BPalettePanelInterface#setPalettePanelTarget(java.lang.Object) + */ + public boolean setPalettePanelTarget(Object _target) { + return false; + } + + // Changement dans le comboBox des calques ou dans les boutons de d\xE9placements \\ + + public void actionPerformed(ActionEvent e) { + if(e.getSource()==calque_){ + updateListen(); + fillTableGeometry(); + updateBtMovement(); + } + else if(e.getSource()==btUp_) + moveUpSelectedGeometies(); + else if(e.getSource()==btDown_) + moveDownSelectedGeometies(); + } + + //Changement dans le checkBox onlyInvisible \\ + + public void stateChanged(ChangeEvent e) { + onlyInvisible_=!onlyInvisible_; + fillTableGeometry(); + } + + // Changement dans l'arbre des calques \\ + + public void treeNodesChanged(TreeModelEvent e) { + fillCalqueComboBox(); + } + + public void treeNodesInserted(TreeModelEvent e) { + fillCalqueComboBox(); + } + + public void treeNodesRemoved(TreeModelEvent e) { + fillCalqueComboBox(); + } + + public void treeStructureChanged(TreeModelEvent e) { + fillCalqueComboBox(); + } + + // Modification dans le ou les model(s) \xE9cout\xE9(s). + + public void attributeAction(Object _source, int att, GISAttributeInterface _att, int _action) { + fillTableGeometry(); + } + + public void attributeValueChangeAction(Object _source, int att, GISAttributeInterface _att, int _geom, Object _value) { + if(listenVisibility&&(_att==GISAttributeConstants.TITRE||_att==GISAttributeConstants.VISIBILITE||_att==null)){ + // Recherche le calque contenant le model + boolean foundCalque=false; + int j=-1; + ZCalqueEditable[] calques=scene_.getEditableLayers(); + while (!foundCalque&&++j<calques.length) + foundCalque=calques[j].getModelEditable()==_source; + if (foundCalque) { + if (_geom>=0) { + int idxGeom=scene_.layerId2SceneId(calques[j], _geom); + // Mise \xE0 jour seulement de la g\xE9om\xE9trie. + boolean found=false; + int i=-1; + while (!found&&++i<table_.getModel().getRowCount()) { + ZModeleEditable model=(ZModeleEditable)table_.getModel().getValueAt(i, 2); + Integer indexGeom=(Integer)table_.getModel().getValueAt(i, 3); + found=(model==_source)&&(indexGeom==idxGeom); + } + if (found) + if (_att==GISAttributeConstants.TITRE) + table_.getModel().setValueAt(_value, i, 0); + else if (_att==GISAttributeConstants.VISIBILITE) + table_.getModel().setValueAt(_value.equals(GISAttributeConstants.ATT_VAL_TRUE) ? true:false, i, 1); + else { + GISZoneCollection zone=((ZModeleEditable)_source).getGeomData(); + table_.getModel().setValueAt( + ((ZModeleEditable)_source).getGeomData().getValue(zone.getIndiceOf(GISAttributeConstants.TITRE), _geom), i, 0); + table_.getModel().setValueAt( + ((ZModeleEditable)_source).getGeomData().getValue(zone.getIndiceOf(GISAttributeConstants.VISIBILITE), _geom) + .equals(GISAttributeConstants.ATT_VAL_TRUE) ? true:false, i, 1); + } + } + else + // Mise \xE0 jour de toutes les g\xE9om\xE9tries. + fillTableGeometry(); + } + } + } + + public void geometryAction(Object _source, int geom, Geometry _geom, int _action) { + if(_action!=GEOMETRY_ACTION_MODIFY) + fillTableGeometry(); + } + + // La selection dans un calque \xE0 chang\xE9e \\ + + public void selectionChanged(ZSelectionEvent _evt) { + if (listenSelection) { + listenSelection=false; + updateTableSelection(); + updateBtMovement(); + listenSelection=true; + } + } + + // La selection dans le tableau \xE0 chang\xE9e \\ + + public void valueChanged(ListSelectionEvent _e) { + if (listenSelection) { + listenSelection=false; + updateCalqueSelection(); + updateBtMovement(); + listenSelection=true; + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |