TrajectoriesView.java :  » Java-3D » videso3d » fr » crnan » videso3d » ihm » Java Open Source

Java Open Source » Java 3D » videso3d 
videso3d » fr » crnan » videso3d » ihm » TrajectoriesView.java
/*
 * This file is part of ViDESO.
 * ViDESO is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * ViDESO is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ViDESO.  If not, see <http://www.gnu.org/licenses/>.
 */
package fr.crnan.videso3d.ihm;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.Collection;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.JXTaskPane;
import org.jdesktop.swingx.JXTaskPaneContainer;

import fr.crnan.videso3d.Triplet;
import fr.crnan.videso3d.VidesoGLCanvas;
import fr.crnan.videso3d.formats.TrackFilesReader;
import fr.crnan.videso3d.formats.VidesoTrack;
import fr.crnan.videso3d.formats.geo.GEOReader;
import fr.crnan.videso3d.formats.geo.GEOTrack;
import fr.crnan.videso3d.formats.geo.GEOWriter;
import fr.crnan.videso3d.formats.lpln.LPLNTrack;
import fr.crnan.videso3d.formats.opas.OPASTrack;
import fr.crnan.videso3d.ihm.components.VFileChooser;
import fr.crnan.videso3d.ihm.components.VXTable;
import fr.crnan.videso3d.layers.GEOTracksLayer;
import fr.crnan.videso3d.layers.LPLNTracksLayer;
import fr.crnan.videso3d.layers.OPASTracksLayer;
import fr.crnan.videso3d.layers.TrajectoriesLayer;
import fr.crnan.videso3d.trajectography.PolygonsSetFilter;
import fr.crnan.videso3d.trajectography.TrackContext;
import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.tracks.Track;

/**
 * Panel de slection des trajectoires affiches
 * @author Bruno Spyckerelle
 * @version 0.4.2
 */
public class TrajectoriesView extends JPanel {

  private JXTaskPaneContainer content = new JXTaskPaneContainer();
  
  private List<Triplet<String, String, Color>> colorFilters;
  
  private TrajectoriesLayer layer;

  private VidesoGLCanvas wwd;
  
  private ContextPanel context;
  
  private TrackContext trackContext;
  
  public TrajectoriesView(final VidesoGLCanvas wwd, final TrackFilesReader reader, final ContextPanel contxt){
    this.context = contxt;
    this.layer = reader.getLayer() == null ? wwd.addTrajectoires(reader) : reader.getLayer();
    this.wwd = wwd;
    this.trackContext = new TrackContext(this.layer, reader, null, this.wwd.getModel().getGlobe());
    
    final JXTaskPane filterPolygonPane = this.createPolygonFilterPane();
    
    
    this.setLayout(new BorderLayout());
    JScrollPane scrollContent = new JScrollPane(content);
    scrollContent.setBorder(null);
    this.add(scrollContent, BorderLayout.CENTER);    
    
    final JXTaskPane table = new JXTaskPane("Trajectoires affiches ("+layer.getSelectedTracks().size()+")");
    final VXTable pistes = new VXTable(new TrackTableModel());
    pistes.setFillsViewportHeight(true);
    //listener pour le highlight des lignes slectionnes
    pistes.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
      
      @Override
      public void valueChanged(ListSelectionEvent e) {
        if(!e.getValueIsAdjusting()){
          if(e.getFirstIndex() != -1){
            for(int i = e.getFirstIndex(); i <= e.getLastIndex(); i++){
              layer.highlightTrack(
                  (Track)((TrackTableModel)pistes.getModel()).getTrackAt(pistes.convertRowIndexToModel(i)),
                  pistes.isRowSelected(i));
            }
          }
        }
      }
    });
    pistes.addMouseListener(new MouseListener() {
      
      @Override
      public void mouseReleased(MouseEvent arg0) {}
      
      @Override
      public void mousePressed(MouseEvent arg0) {}
      
      @Override
      public void mouseExited(MouseEvent arg0) {}
      
      @Override
      public void mouseEntered(MouseEvent arg0) {}
      
      @Override
      public void mouseClicked(MouseEvent e) {
        if(e.getClickCount() == 2){
          int row = pistes.rowAtPoint(e.getPoint());
          final VidesoTrack t = (VidesoTrack)((TrackTableModel)pistes.getModel()).getTrackAt(pistes.convertRowIndexToModel(row));
          trackContext.updateTrackPane(t);
          context.setTaskPanes(trackContext.getTaskPanes(0, null));
          context.open();
          wwd.centerView(t);
        }
      }
    });    

    if(layer instanceof LPLNTracksLayer){
      pistes.getColumnExt("IAF").setVisible(false);
    } else if (layer instanceof GEOTracksLayer) {
      pistes.getColumnExt("IAF").setVisible(false);
    } else if (layer instanceof OPASTracksLayer) {
      pistes.getColumnExt("Type").setVisible(false);
    }
    pistes.getColumnExt("Affich").setVisible(layer.isTrackHideable());
    pistes.setColumnControlVisible(true);
    pistes.packAll();
    
    JScrollPane scrollPistes = new JScrollPane(pistes);
    scrollPistes.setBorder(null);
    scrollPistes.setPreferredSize(new Dimension(600,600));
    table.add(scrollPistes);
        
    content.add(this.createStylePane(), null);
    content.add(this.createFilterPane(), null);
    if(layer.isTrackColorFiltrable()) content.add(this.createColorFilterPane(), null);
    content.add(filterPolygonPane, null);
    filterPolygonPane.setVisible(layer.getPolygonFilters() != null && layer.getPolygonFilters().size()>0);
    content.add(table, null);
    
    this.layer.addPropertyChangeListener(AVKey.LAYER, new PropertyChangeListener() {

      @Override
      public void propertyChange(PropertyChangeEvent arg0) {
        table.setTitle("Trajectoires affiches ("+layer.getSelectedTracks().size()+")");
        filterPolygonPane.setVisible((layer.getPolygonFilters() != null && layer.getPolygonFilters().size() > 0));
      }
    });
    
    if(reader instanceof GEOReader) {
      final JButton save = new JButton("Sauver");
      save.setToolTipText("Enregistrer les trajectoires affiches");
      save.addActionListener(new ActionListener() {
        
        @Override
        public void actionPerformed(ActionEvent arg0) {
          VFileChooser fileChooser = new VFileChooser();
          if(fileChooser.showSaveDialog(save) == JFileChooser.APPROVE_OPTION){
            final String file = fileChooser.getSelectedFile().getAbsolutePath();
            if(!(new File(file).exists()) || 
                (new File(file).exists() &&
                    JOptionPane.showConfirmDialog(null, "Le fichier existe dj.\n\nSouhaitez-vous rellement l'craser ?",
                        "Confirmer la suppression du fichier prcdent",
                        JOptionPane.OK_CANCEL_OPTION,
                        JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION)) {

              Collection<? extends VidesoTrack> tracks = layer.getSelectedTracks();
              final javax.swing.ProgressMonitor progress = new javax.swing.ProgressMonitor(null, "Sauvegarde des trajectoires slectionnes", "",
                  0, tracks.size()-1);
              progress.setMillisToDecideToPopup(0);
              progress.setMillisToPopup(0);
              new SwingWorker<Integer, Integer>() {

                @Override
                protected Integer doInBackground()
                throws Exception {
                  GEOWriter writer = new GEOWriter(file, true);
                  int i = 0;
                  for(VidesoTrack track : layer.getSelectedTracks()){
                    if(progress.isCanceled()){
                      writer.cancel();
                      return null;
                    }
                    i++;
                    progress.setProgress(i);
                    progress.setNote(i+" trajectoires sur "+progress.getMaximum());
                    writer.writeTrack((GEOTrack) track);
                  }
                  writer.close();
                  return null;
                }

              }.execute();

              progress.close();

            }
          }
        }
      });
      this.add(save, BorderLayout.SOUTH);
    }

  }
  
  private JXTaskPane createPolygonFilterPane(){
    JXTaskPane filterPolygonPane = new JXTaskPane("Filtres volumiques");
    final JXTable polygonsTable = new JXTable(new PolygonTableModel());
    polygonsTable.setColumnControlVisible(true);
    polygonsTable.addMouseListener(new MouseListener() {
      
      @Override
      public void mouseReleased(MouseEvent arg0) {}
      
      @Override
      public void mousePressed(MouseEvent arg0) {}
      
      @Override
      public void mouseExited(MouseEvent arg0) {}
      
      @Override
      public void mouseEntered(MouseEvent arg0) {}
      
      @Override
      public void mouseClicked(MouseEvent e) {
        if(e.getButton() == MouseEvent.BUTTON3){
          int rowView = polygonsTable.rowAtPoint(e.getPoint());
          polygonsTable.setRowSelectionInterval(rowView, rowView);
          final int rowModel = polygonsTable.convertRowIndexToModel(rowView);
          final JPopupMenu menu = new JPopupMenu();
          JMenuItem delete = new JMenuItem("Supprimer");
          delete.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent arg0) {
              ((PolygonTableModel)polygonsTable.getModel()).deleteRow(rowModel);
              menu.setVisible(false);
            }
          });
          menu.add(delete);
          menu.setLocation(e.getPoint());
          menu.show(e.getComponent(), e.getX(), e.getY());
        }
      }
    });
    
    final ProgressMonitor progress = new ProgressMonitor(this, "Mise  jour des polygones", "", 0, 1);
    progress.setMillisToDecideToPopup(200);
    progress.setMillisToPopup(1000);
    layer.addPropertyChangeListener(new PropertyChangeListener() {
      
      @Override
      public void propertyChange(PropertyChangeEvent p) {
        if(p.getPropertyName().equals("change")){
          progress.setMaximum((Integer) p.getNewValue());
          progress.resetTimer();
        } else if(p.getPropertyName().equals("progress")){
          progress.setProgress((Integer) p.getNewValue());
        }
      }
    });
    
    JPanel container = new JPanel(new BorderLayout());
    container.add(polygonsTable.getTableHeader(), BorderLayout.NORTH);
    container.add(polygonsTable, BorderLayout.CENTER);
    filterPolygonPane.add(container);
    return filterPolygonPane;
  }
  
  private JXTaskPane createStylePane(){
    JXTaskPane stylePane = new JXTaskPane("Style des trajectoires");
    stylePane.setCollapsed(true);
    
    stylePane.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 1;
    
    stylePane.add(new JLabel("Style du trac"), c);
    
    c.gridx = 1;
    final JComboBox styles = new JComboBox();
    for(Integer style : layer.getStylesAvailable()){
      switch(style) {
      case TrajectoriesLayer.STYLE_CURTAIN:
        styles.addItem("Rideau");
        break;
      case TrajectoriesLayer.STYLE_PROFIL:
        styles.addItem("Profil avec balises");
        break;
      case TrajectoriesLayer.STYLE_SHADED:
        styles.addItem("Fil de fer dgrad");
        break;
      case TrajectoriesLayer.STYLE_SIMPLE:
        styles.addItem("Fil de fer");
        break;
      }
    }

    switch(layer.getStyle()) {
    case TrajectoriesLayer.STYLE_CURTAIN:
      styles.setSelectedItem("Rideau");
      break;
    case TrajectoriesLayer.STYLE_PROFIL:
      styles.setSelectedItem("Profil avec balises");
      break;
    case TrajectoriesLayer.STYLE_SHADED:
      styles.setSelectedItem("Fil de fer dgrad");
      break;
    case TrajectoriesLayer.STYLE_SIMPLE:
      styles.setSelectedItem("Fil de fer");
      break;
    }
    
    stylePane.add(styles, c);
    
    c.gridx = 0;
    c.gridy = 1;
    
    stylePane.add(new JLabel("Couleur interne"), c);
    
    c.gridx = 1;
    
    final JButton changeColor1 = new JButton(new ImageIcon(getClass().getResource("/resources/fill-color.png"))); 
    changeColor1.setBackground(layer.getDefaultInsideColor());
    changeColor1.addActionListener(new ActionListener() {
      
      @Override
      public void actionPerformed(ActionEvent arg0) {
        changeColor1.setBackground(JColorChooser.showDialog(null, "Couleur", changeColor1.getBackground()));
      }
    });
    stylePane.add(changeColor1, c);
    
    c.gridx = 0;
    c.gridy = 2;
    
    stylePane.add(new JLabel("Couleur externe"), c);
    
    c.gridx = 1;
    
    final JButton changeColor2 = new JButton(new ImageIcon(getClass().getResource("/resources/fill-color.png"))); 
    changeColor2.setBackground(layer.getDefaultOutsideColor());
    changeColor2.addActionListener(new ActionListener() {
      
      @Override
      public void actionPerformed(ActionEvent arg0) {
        changeColor2.setBackground(JColorChooser.showDialog(null, "Couleur", changeColor2.getBackground()));
      }
    });
    stylePane.add(changeColor2, c);
    
    c.gridx = 0;
    c.gridy = 3;
    
    stylePane.add(new JLabel("Opacit"), c);
    
    c.gridx = 1;
    
    final JTextField opacity = new JTextField(15);
    opacity.setToolTipText("Valeur comprise entre 0 (transparent) et 100.");
    opacity.setText(String.valueOf(layer.getDefaultOpacity()*100));
    
    stylePane.add(opacity, c);
    
    c.gridx = 0;
    c.gridy = 4;
    
    stylePane.add(new JLabel("Largeur du trac"), c);
    
    c.gridx = 1;
    
    final JTextField width = new JTextField(15);
    width.setToolTipText("Valeur comprise entre 0 (transparent) et 100.");
    width.setText(String.valueOf(layer.getDefaultWidth()));
    
    stylePane.add(width, c);
    
    c.gridx = 1;
    c.gridy = 5;
    
    JButton validate = new JButton("Valider");
    
    validate.addActionListener(new ActionListener() {
      
      @Override
      public void actionPerformed(ActionEvent arg0) {
        
        String itemSelected = (String) styles.getSelectedItem();
        if(itemSelected.equals("Rideau")){
          layer.setStyle(TrajectoriesLayer.STYLE_CURTAIN);
        } else if(itemSelected.equals("Fil de fer")){
          layer.setStyle(TrajectoriesLayer.STYLE_SIMPLE);
        } else if(itemSelected.equals("Fil de fer dgrad")){
          layer.setStyle(TrajectoriesLayer.STYLE_SHADED);
        } else if(itemSelected.equals("Profil")){
          layer.setStyle(TrajectoriesLayer.STYLE_PROFIL);
        }
        
        layer.setDefaultOutsideColor(changeColor2.getBackground());
        layer.setDefaultInsideColor(changeColor1.getBackground());
        layer.setDefaultWidth(Double.parseDouble(width.getText()));
        layer.setDefaultOpacity(Double.parseDouble(opacity.getText())/100.0);
        
      //  layer.update();
      }
    });
    
    stylePane.add(validate, c);  

    
    return stylePane;
  }
  
  private JXTaskPane createColorFilterPane(){
    JXTaskPane colorFilterPane = new JXTaskPane("Filtres de couleurs");
    colorFilterPane.setCollapsed(true);
    
    //Gestion des couleurs
    final TrajectoriesColorsDialog colors = new TrajectoriesColorsDialog(colorFilters);
    colors.addPropertyChangeListener("valuesChanged", new PropertyChangeListener() {

      @Override
      public void propertyChange(PropertyChangeEvent p) {
        layer.resetFilterColor();
        if(p.getNewValue() != null) {
          for(Triplet<String, String, Color> filter : (List<Triplet<String, String, Color>>)p.getNewValue()){
            layer.addFilterColor(TrajectoriesLayer.string2type(filter.getFirst()), filter.getSecond(), filter.getThird());
          }
        }
      }
    });
    colorFilterPane.add(colors);
    
    return colorFilterPane;
  }
  
  private JXTaskPane createFilterPane(){
    JXTaskPane filterPane = new JXTaskPane("Filtres");
    filterPane.setCollapsed(true);
    
    filterPane.add(this.createTitleSwitch());
    
    JPanel filtres = new JPanel();
    filtres.setLayout(new BoxLayout(filtres, BoxLayout.Y_AXIS));    

    JPanel indicatif = new JPanel();
    indicatif.setLayout(new BoxLayout(indicatif, BoxLayout.X_AXIS));
    JLabel indicLabel = new JLabel("Indicatif : ");
    final JTextField indicField = new JTextField(10);
    indicField.setMaximumSize(new Dimension(100, 30));
    indicatif.add(indicLabel);
    indicatif.add(Box.createHorizontalGlue());
    indicatif.add(indicField);

    filtres.add(indicatif);
    
    JPanel aDep = new JPanel();
    aDep.setLayout(new BoxLayout(aDep, BoxLayout.X_AXIS));
    JLabel aDepLabel = new JLabel("Aroport dpart : ");
    final JTextField aDepField = new JTextField(10);
    aDepField.setMaximumSize(new Dimension(100, 30));
    aDep.add(aDepLabel);
    aDep.add(Box.createHorizontalGlue());
    aDep.add(aDepField);

    filtres.add(aDep);

    JPanel aDest = new JPanel();
    aDest.setLayout(new BoxLayout(aDest, BoxLayout.X_AXIS));
    JLabel aDestLabel = new JLabel("Aroport arrive : ");
    final JTextField aDestField = new JTextField(10);
    aDestField.setMaximumSize(new Dimension(100, 30));
    aDest.add(aDestLabel);
    aDest.add(Box.createHorizontalGlue());
    aDest.add(aDestField);

    filtres.add(aDest);

    JPanel iaf = new JPanel();
    iaf.setLayout(new BoxLayout(iaf, BoxLayout.X_AXIS));
    JLabel iafLabel = new JLabel("IAF : ");
    final JTextField iafField = new JTextField(10);
    iafField.setMaximumSize(new Dimension(100, 30));
    iaf.add(iafLabel);
    iaf.add(Box.createHorizontalGlue());
    iaf.add(iafField);

    filtres.add(iaf);

    JPanel type = new JPanel();
    type.setLayout(new BoxLayout(type, BoxLayout.X_AXIS));
    JLabel typeLabel = new JLabel("Type avion : ");
    final JTextField typeField = new JTextField(10);
    typeField.setMaximumSize(new Dimension(100, 30));
    type.add(typeLabel);
    type.add(Box.createHorizontalGlue());
    type.add(typeField);

    filtres.add(type);
    
    JPanel validate = new JPanel();
    validate.setLayout(new BoxLayout(validate, BoxLayout.X_AXIS));
    JButton val = new JButton("Filtrer");
    validate.add(val);
    val.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent arg0) {
        layer.removeFilter();
        if(!indicField.getText().isEmpty()){
          layer.addFilter(TrajectoriesLayer.FIELD_INDICATIF, indicField.getText());
        }
        if(!aDepField.getText().isEmpty()){
          layer.addFilter(TrajectoriesLayer.FIELD_ADEP, aDepField.getText());
        }
        if(!aDestField.getText().isEmpty()){
          layer.addFilter(TrajectoriesLayer.FIELD_ADEST, aDestField.getText());
        }
        if(!iafField.getText().isEmpty()){
          layer.addFilter(TrajectoriesLayer.FIELD_IAF, iafField.getText());
        }
        if(!typeField.getText().isEmpty()){
          layer.addFilter(TrajectoriesLayer.FIELD_TYPE_AVION, typeField.getText());
        }
        layer.update();
        trackContext.updateLayerPane();
      }
    });
    JButton cancel = new JButton("Effacer");
    validate.add(cancel);
    cancel.addActionListener(new ActionListener() {  
      @Override
      public void actionPerformed(ActionEvent e) {
        indicField.setText("");
        aDepField.setText("");
        aDestField.setText("");
        iafField.setText("");
        typeField.setText("");
        layer.removeFilter();
        layer.update();
        trackContext.updateLayerPane();
      }
    });
    filtres.add(validate);
    filterPane.add(filtres);    
    return filterPane;
  }
  
  /**
   * Cre la zone de titre avec un switch et/ou
   * @return JPanel
   */
  private JPanel createTitleSwitch(){
    JPanel titre = new JPanel();
    titre.setLayout(new BoxLayout(titre, BoxLayout.X_AXIS));
    titre.setBorder(BorderFactory.createEmptyBorder(0, 17, 1, 3));
    
    JRadioButton et = new JRadioButton("Et");
    et.addItemListener(new ItemListener() {
      
      @Override
      public void itemStateChanged(ItemEvent e) {
        layer.setFilterDisjunctive(!(e.getStateChange() == ItemEvent.SELECTED));
      }
    });
    JRadioButton ou = new JRadioButton("Ou");
    ou.setSelected(true);
    ButtonGroup group = new ButtonGroup();
    group.add(et);
    group.add(ou);
    
    JPanel groupPanel = new JPanel();
    groupPanel.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3));
    groupPanel.setLayout(new BoxLayout(groupPanel, BoxLayout.X_AXIS));
    groupPanel.add(Box.createHorizontalGlue());
    groupPanel.add(et);
    groupPanel.add(ou);
    titre.add(groupPanel);
    
    return titre;
  }
  
  /**
   * Supprime le layer associ au slecteur.<br />
   */
  public void delete(){
    this.wwd.getModel().getLayers().remove(layer);
  }
  
  private class TrackTableModel extends AbstractTableModel {

    String[] columnNames = {"Indicatif", "Dpart", "Arrive", "IAF", "Type", "Affich"};

    Object[] tracks = null;

    Collection<? extends Track> tracksCollection;
    
    public TrackTableModel(){
      super();
      tracks = layer.getSelectedTracks().toArray();//TODO grer les mauvais fichiers
      tracksCollection = layer.getSelectedTracks();
      layer.addPropertyChangeListener(AVKey.LAYER, new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
          if(!tracksCollection.equals(layer.getSelectedTracks())){
            tracks = layer.getSelectedTracks().toArray();
            tracksCollection = layer.getSelectedTracks();
            fireTableDataChanged();
          }
        }
      });
    }
    
    public Object getTrackAt(int row){
      return tracks[row];
    }
    
    @Override
    public String getColumnName(int col) {
          return columnNames[col];
      }

    
    @Override
    public int getColumnCount() {
      return columnNames.length;
    }

    @Override
    public int getRowCount() {
      return tracks.length;
    }

    @Override
    public Object getValueAt(int row, int col) {
      Track t = (Track) tracks[row];
      if(t instanceof GEOTrack){
        switch (col) {
        case 0:
          return ((GEOTrack)t).getIndicatif();
        case 1:
          return ((GEOTrack)t).getDepart();
        case 2:
          return ((GEOTrack)t).getArrivee();
        case 3:
          return "";
        case 4:
          return ((GEOTrack)t).getType();
        case 5:
          return layer.isVisible((Track)t);
        default:
          return "";
        }
      } else if(t instanceof OPASTrack){
        switch (col) {
        case 0:
          return ((OPASTrack)t).getIndicatif();
        case 1:
          return ((OPASTrack)t).getDepart();
        case 2:
          return ((OPASTrack)t).getArrivee();
        case 3:
          return ((OPASTrack)t).getIaf();
        case 4:
          return "";
        case 5:
          return layer.isVisible((Track)t);
        default:
          return "";
        }
      } else if(t instanceof LPLNTrack) {
        switch (col) {
        case 0:
          return ((LPLNTrack)t).getIndicatif();
        case 1:
          return ((LPLNTrack)t).getDepart();
        case 2:
          return ((LPLNTrack)t).getArrivee();
        case 3:
          return "";
        case 4:
          return ((LPLNTrack)t).getType();
        case 5:
          return layer.isVisible((Track)t);
        default:
          return "";
        }
      } else {
        return "";
      }
    }

    
    /* (non-Javadoc)
     * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
     */
    @Override
    public Class<?> getColumnClass(int columnIndex) {
      if(columnIndex == 5){
        return Boolean.class;
      } else {
        return String.class;
      }
    }

    /* (non-Javadoc)
     * @see javax.swing.table.AbstractTableModel#isCellEditable(int, int)
     */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
      if(columnIndex == 5){
        return true;
      } else {
        return false;
      }
    }

    /* (non-Javadoc)
     * @see javax.swing.table.AbstractTableModel#setValueAt(java.lang.Object, int, int)
     */
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      if(columnIndex == 5){
        layer.setVisible((Boolean)aValue, (Track)tracks[rowIndex]);
        fireTableDataChanged();
      }
    }

    
    
  }
  
  private class PolygonTableModel extends AbstractTableModel {

    private String[] columnNames = {"Nom", "Trajectoires", "Actif"};

    private List<PolygonsSetFilter> polygons;
            
    public PolygonTableModel(){
      super();
      if(layer.getPolygonFilters() != null){
        this.polygons = layer.getPolygonFilters();
      }
      
      layer.addPropertyChangeListener(AVKey.LAYER, new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
          if(layer.getPolygonFilters() != null){
            polygons = layer.getPolygonFilters();
            fireTableDataChanged();
          }
        }
      });
    }
    
    public void deleteRow(int rowModel) {
      PolygonsSetFilter filters = (PolygonsSetFilter) this.polygons.get(rowModel);
      this.polygons.remove(rowModel);
      layer.removePolygonFilter(filters);
      this.fireTableDataChanged();
    }
    
    @Override
    public String getColumnName(int col) {
          return columnNames[col];
      }
    
    @Override
    public int getColumnCount() {
      return columnNames.length;
    }

    @Override
    public int getRowCount() {
      if(polygons == null){
        return 0;
      } else {
        return polygons.size();
      }
    }

    @Override
    public Object getValueAt(int row, int col) {
      switch (col) {
      case 0:
        return this.polygons.get(row).getName();
      case 1:
        return this.polygons.get(row).getContainedTrajectories();
      case 2:
        return this.polygons.get(row).isActive();
      default:
        return "";
      }
      
    }

    
    /* (non-Javadoc)
     * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
     */
    @Override
    public Class<?> getColumnClass(int columnIndex) {
      if(columnIndex == 2){
        return Boolean.class;
      } else if(columnIndex == 1){
        return Integer.class;
      } else {
        return String.class;
      }
    }

    /* (non-Javadoc)
     * @see javax.swing.table.AbstractTableModel#isCellEditable(int, int)
     */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
      if(columnIndex == 2){
        return true;
      } else {
        return false;
      }
    }

    /* (non-Javadoc)
     * @see javax.swing.table.AbstractTableModel#setValueAt(java.lang.Object, int, int)
     */
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      if(columnIndex == 2){
        if((Boolean) aValue){
          layer.enablePolygonFilter(this.polygons.get(rowIndex));
        } else {
          layer.disablePolygonFilter(this.polygons.get(rowIndex));
        }
        fireTableDataChanged();
      }
    }

    
    
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.