/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * FeatureControl.java * * Created on 3. Mai 2006, 11:31 */ package de.cismet.cismap.commons.gui.featurecontrolwidget; import com.vividsolutions.jts.geom.Geometry; import edu.umd.cs.piccolo.util.PBounds; import edu.umd.cs.piccolo.util.PDimension; import org.apache.log4j.Logger; import org.jdesktop.swingx.table.TableColumnExt; import org.jdom.Element; import java.awt.EventQueue; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Vector; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.RowFilter; import javax.swing.SortOrder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableRowSorter; import de.cismet.cismap.commons.CrsTransformer; import de.cismet.cismap.commons.features.AbstractNewFeature; import de.cismet.cismap.commons.features.DefaultFeatureCollection; import de.cismet.cismap.commons.features.Feature; import de.cismet.cismap.commons.features.FeatureCollection; import de.cismet.cismap.commons.features.FeatureCollectionEvent; import de.cismet.cismap.commons.features.FeatureCollectionListener; import de.cismet.cismap.commons.features.FeatureGroup; import de.cismet.cismap.commons.features.FeatureGroups; import de.cismet.cismap.commons.features.FeatureRenderer; import de.cismet.cismap.commons.features.FeatureRendererAwareFeature; import de.cismet.cismap.commons.features.SubFeature; import de.cismet.cismap.commons.features.XStyledFeature; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.gui.piccolo.PFeature; import de.cismet.cismap.commons.interaction.CismapBroker; import de.cismet.cismap.commons.interaction.MapBoundsListener; import de.cismet.tools.CurrentStackTrace; import de.cismet.tools.StaticDecimalTools; import de.cismet.tools.collections.TypeSafeCollections; import de.cismet.tools.configuration.Configurable; /** * DOCUMENT ME! * * @author thorsten.hell@cismet.de * @version $Revision$, $Date$ */ public class FeatureControl extends javax.swing.JPanel implements FeatureCollectionListener, MapBoundsListener, Configurable { //~ Static fields/initializers --------------------------------------------- private static final transient Logger LOG = Logger.getLogger(FeatureControl.class); //~ Instance fields -------------------------------------------------------- boolean wizardMode = false; private FeatureCollectionFilter featureCollectionFilter; private ImageIcon icoGreenled = new ImageIcon(getClass().getResource( "/de/cismet/cismap/commons/gui/res/greenled.png")); // NOI18N private MappingComponent mappingComponent = null; private ListSelectionListener theListSelectionListener = new ListSelectionListener() { @Override public void valueChanged(final ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { if (LOG.isDebugEnabled()) { LOG.debug("invocation of the method SelectionListener.valueChanged from jxtFeatures"); // NOI18N } updateSelection(); } } }; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cmdHold; private javax.swing.JButton cmdRemoveAll; private javax.swing.JButton cmdRemoveFeatures; private javax.swing.JButton cmdZoomToAllFeatures; private javax.swing.JButton cmdZoomToFeatures; private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JToolBar jToolBar1; private org.jdesktop.swingx.JXTable jxtFeatures; private javax.swing.JToggleButton togDisplayObjectInfo; private javax.swing.JToggleButton togFixMapExtent; private javax.swing.JToggleButton togFixMapScale; private javax.swing.JToggleButton togHoldAll; private javax.swing.JToggleButton togSelectionWizard; private javax.swing.JToggleButton togShowOnlyVisible; // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates new form FeatureControl. * * @param mappingComponent DOCUMENT ME! */ public FeatureControl(final de.cismet.cismap.commons.gui.MappingComponent mappingComponent) { initComponents(); this.mappingComponent = mappingComponent; final FeatureCollectionTableModel model = new FeatureCollectionTableModel(); jxtFeatures.setModel(model); jxtFeatures.getColumnModel().getColumn(0).setCellRenderer(jxtFeatures.getDefaultRenderer(Icon.class)); jxtFeatures.getColumnModel().getColumn(4).setCellRenderer(jxtFeatures.getDefaultRenderer(Number.class)); jxtFeatures.getColumnModel().getColumn(5).setCellRenderer(jxtFeatures.getDefaultRenderer(Number.class)); jxtFeatures.getColumnModel().getColumn(7).setCellRenderer(jxtFeatures.getDefaultRenderer(Icon.class)); featureCollectionFilter = new FeatureCollectionFilter(false, model); final ArrayList<RowFilter<AbstractTableModel, Integer>> usedFilters = new ArrayList<RowFilter<AbstractTableModel, Integer>>(); if (FeatureGroups.SHOW_GROUPING_ENABLED) { usedFilters.add(featureCollectionFilter); } else { final SubFeatureFilter subFeatureFilter = new SubFeatureFilter(); usedFilters.add(featureCollectionFilter); usedFilters.add(subFeatureFilter); } final TableRowSorter<FeatureCollectionTableModel> sorter = new TableRowSorter<FeatureCollectionTableModel>( model); sorter.setRowFilter(RowFilter.andFilter(usedFilters)); jxtFeatures.setRowSorter(sorter); jxtFeatures.getSelectionModel().addListSelectionListener(theListSelectionListener); jxtFeatures.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(final MouseEvent e) { if (e.getClickCount() > 1) { updateSelection(); } } }); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! */ private void updateSelection() { final int[] rows = jxtFeatures.getSelectedRows(); final List<Feature> tableSelection = TypeSafeCollections.newArrayList(); for (int i = 0; i < rows.length; i++) { final int mappedRow = mapRowToModel(rows[i]); tableSelection.add(getFeatureCollection().getFeature(mappedRow)); } // Hinter die Schleife gestellt, damit nicht f\u00FCr alle selektierten Features ein Event gefeuert wird mappingComponent.getFeatureCollection().removeFeatureCollectionListener(FeatureControl.this); mappingComponent.getFeatureCollection().select(tableSelection); mappingComponent.getFeatureCollection().addFeatureCollectionListener(FeatureControl.this); } /** * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The * content of this method is always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); togSelectionWizard = new javax.swing.JToggleButton(); jToolBar1 = new javax.swing.JToolBar(); cmdZoomToAllFeatures = new javax.swing.JButton(); cmdZoomToFeatures = new javax.swing.JButton(); cmdRemoveFeatures = new javax.swing.JButton(); cmdRemoveAll = new javax.swing.JButton(); togShowOnlyVisible = new javax.swing.JToggleButton(); togFixMapExtent = new javax.swing.JToggleButton(); togFixMapScale = new javax.swing.JToggleButton(); togDisplayObjectInfo = new javax.swing.JToggleButton(); togHoldAll = new javax.swing.JToggleButton(); cmdHold = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); jxtFeatures = new org.jdesktop.swingx.JXTable(); jButton1.setText(null); jButton2.setText(null); jButton3.setForeground(javax.swing.UIManager.getDefaults().getColor("Table.selectionBackground")); jButton3.setText(null); jButton3.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); togSelectionWizard.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/wizard.png"))); // NOI18N togSelectionWizard.setRolloverIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/wizard.png"))); // NOI18N togSelectionWizard.setRolloverSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/wizard.png"))); // NOI18N togSelectionWizard.setSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/wizard.png"))); // NOI18N togSelectionWizard.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { togSelectionWizardActionPerformed(evt); } }); setBorder(javax.swing.BorderFactory.createCompoundBorder( javax.swing.BorderFactory.createEtchedBorder(), javax.swing.BorderFactory.createEmptyBorder(4, 4, 4, 4))); setLayout(new java.awt.BorderLayout()); jToolBar1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); cmdZoomToAllFeatures.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/zoomToAll.png"))); // NOI18N cmdZoomToAllFeatures.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.cmdZoomToAllFeatures.toolTipText")); // NOI18N cmdZoomToAllFeatures.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdZoomToAllFeaturesActionPerformed(evt); } }); jToolBar1.add(cmdZoomToAllFeatures); cmdZoomToFeatures.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/zoomToSelection.png"))); // NOI18N cmdZoomToFeatures.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.cmdZoomToFeatures.toolTipText")); // NOI18N cmdZoomToFeatures.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdZoomToFeaturesActionPerformed(evt); } }); cmdZoomToFeatures.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseEntered(final java.awt.event.MouseEvent evt) { cmdZoomToFeaturesMouseEntered(evt); } @Override public void mouseExited(final java.awt.event.MouseEvent evt) { cmdZoomToFeaturesMouseExited(evt); } }); jToolBar1.add(cmdZoomToFeatures); cmdRemoveFeatures.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/removerow.png"))); // NOI18N cmdRemoveFeatures.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.cmdRemoveFeatures.toolTipText")); // NOI18N cmdRemoveFeatures.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdRemoveFeaturesActionPerformed(evt); } }); jToolBar1.add(cmdRemoveFeatures); cmdRemoveAll.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/removeAll.png"))); // NOI18N cmdRemoveAll.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.cmdRemoveAll.toolTipText")); // NOI18N cmdRemoveAll.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdRemoveAllActionPerformed(evt); } }); jToolBar1.add(cmdRemoveAll); togShowOnlyVisible.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/showOnlyVisible_disabled.png"))); // NOI18N togShowOnlyVisible.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.togShowOnlyVisible.toolTipText")); // NOI18N togShowOnlyVisible.setRolloverIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/showOnlyVisible_disabled.png"))); // NOI18N togShowOnlyVisible.setRolloverSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/showOnlyVisible.png"))); // NOI18N togShowOnlyVisible.setSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/showOnlyVisible.png"))); // NOI18N togShowOnlyVisible.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { togShowOnlyVisibleActionPerformed(evt); } }); jToolBar1.add(togShowOnlyVisible); togFixMapExtent.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/fixMapExtent_disabled.png"))); // NOI18N togFixMapExtent.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.togFixMapExtent.toolTipText")); // NOI18N togFixMapExtent.setRolloverIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/fixMapExtent_disabled.png"))); // NOI18N togFixMapExtent.setRolloverSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/fixMapExtent.png"))); // NOI18N togFixMapExtent.setSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/fixMapExtent.png"))); // NOI18N togFixMapExtent.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { togFixMapExtentActionPerformed(evt); } }); jToolBar1.add(togFixMapExtent); togFixMapScale.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/fixMapScale_disabled.png"))); // NOI18N togFixMapScale.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.togFixMapScale.toolTipText")); // NOI18N togFixMapScale.setRolloverIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/fixMapScale_disabled.png"))); // NOI18N togFixMapScale.setRolloverSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/fixMapScale.png"))); // NOI18N togFixMapScale.setSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/fixMapScale.png"))); // NOI18N togFixMapScale.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { togFixMapScaleActionPerformed(evt); } }); jToolBar1.add(togFixMapScale); togDisplayObjectInfo.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/infoLabel_disabled.png"))); // NOI18N togDisplayObjectInfo.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.togDisplayObjectInfo.toolTipText")); // NOI18N togDisplayObjectInfo.setRolloverIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/infoLabel_disabled.png"))); // NOI18N togDisplayObjectInfo.setRolloverSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/infoLabel.png"))); // NOI18N togDisplayObjectInfo.setSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/infoLabel.png"))); // NOI18N togDisplayObjectInfo.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { togDisplayObjectInfoActionPerformed(evt); } }); jToolBar1.add(togDisplayObjectInfo); togHoldAll.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/holdAll_disabled.png"))); // NOI18N togHoldAll.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.togHoldAll.toolTipText")); // NOI18N togHoldAll.setRolloverIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/holdAll_disabled.png"))); // NOI18N togHoldAll.setRolloverSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/holdAll.png"))); // NOI18N togHoldAll.setSelectedIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/holdAll.png"))); // NOI18N togHoldAll.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { togHoldAllActionPerformed(evt); } }); jToolBar1.add(togHoldAll); cmdHold.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/res/holdSelection.png"))); // NOI18N cmdHold.setToolTipText(org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.cmdHold.toolTipText")); // NOI18N cmdHold.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdHoldActionPerformed(evt); } }); jToolBar1.add(cmdHold); add(jToolBar1, java.awt.BorderLayout.NORTH); jScrollPane2.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); jScrollPane2.setViewportView(jxtFeatures); add(jScrollPane2, java.awt.BorderLayout.CENTER); } // </editor-fold>//GEN-END:initComponents /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void togHoldAllActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_togHoldAllActionPerformed mappingComponent.getFeatureCollection().setHoldAll(togHoldAll.isSelected()); } //GEN-LAST:event_togHoldAllActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void jButton3ActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jButton3ActionPerformed tester(); } //GEN-LAST:event_jButton3ActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdRemoveAllActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdRemoveAllActionPerformed mappingComponent.getFeatureCollection().removeAllFeatures(); mappingComponent.getMemUndo().clear(); mappingComponent.getMemRedo().clear(); } //GEN-LAST:event_cmdRemoveAllActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void togSelectionWizardActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_togSelectionWizardActionPerformed wizardMode = togSelectionWizard.isSelected(); } //GEN-LAST:event_togSelectionWizardActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void togFixMapScaleActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_togFixMapScaleActionPerformed mappingComponent.setFixedMapScale(togFixMapScale.isSelected()); } //GEN-LAST:event_togFixMapScaleActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void togFixMapExtentActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_togFixMapExtentActionPerformed mappingComponent.setFixedMapExtent(togFixMapExtent.isSelected()); } //GEN-LAST:event_togFixMapExtentActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void togDisplayObjectInfoActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_togDisplayObjectInfoActionPerformed mappingComponent.setInfoNodesVisible(togDisplayObjectInfo.isSelected()); } //GEN-LAST:event_togDisplayObjectInfoActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdHoldActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdHoldActionPerformed final int[] rows = jxtFeatures.getSelectedRows(); for (int i = 0; i < rows.length; i++) { final int mappedRow = mapRowToModel(rows[i]); final Feature f = getFeatureCollection().getFeature(mappedRow); if (getFeatureCollection().isHoldFeature(f)) { getFeatureCollection().unholdFeature(f); } else { getFeatureCollection().holdFeature(f); } } } //GEN-LAST:event_cmdHoldActionPerformed /** * DOCUMENT ME! * * @return DOCUMENT ME! */ private FeatureCollection getFeatureCollection() { try { return mappingComponent.getFeatureCollection(); } catch (Exception e) { LOG.warn("Problem with method getFeatureCollection().", e); // NOI18N return new DefaultFeatureCollection(); } } /** * DOCUMENT ME! * * @param displayedRow DOCUMENT ME! * * @return DOCUMENT ME! */ private int mapRowToModel(final int displayedRow) { return jxtFeatures.convertRowIndexToModel(displayedRow); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Vector<Feature> getAllFeaturesSorted() { final Vector<Feature> v = new Vector<Feature>(); final FeatureCollection fc = getFeatureCollection(); if (fc.getFeatureCount() > 0) { for (int i = 0; i < jxtFeatures.getRowCount(); ++i) { try { v.add((Feature)fc.getAllFeatures().get(mapRowToModel(i))); } catch (Throwable t) { LOG.error("Error in getAllFeaturesSorted() allFeatures=" + fc.getAllFeatures() + ", try to access " + mapRowToModel(i) + ". position", t); // NOI18N } } } return v; } /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdRemoveFeaturesActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdRemoveFeaturesActionPerformed mappingComponent.getMemUndo().clear(); mappingComponent.getMemRedo().clear(); final int[] rows = jxtFeatures.getSelectedRows(); final Set<Feature> toRemove = TypeSafeCollections.newHashSet(); int firstSelectedRow = -1; for (int i = 0; i < rows.length; i++) { if (firstSelectedRow == -1) { firstSelectedRow = rows[i]; } final int mappedRow = mapRowToModel(rows[i]); final Feature currentFeature = getFeatureCollection().getFeature(mappedRow); // ENABLE THIS CODE TO HAVE THE SUBFEATURES DELETE FROM THEIR PARENT ON REMOVE FROM MAP // if (currentFeature instanceof SubFeature) { // SubFeature currentSubFeature = (SubFeature) currentFeature; // FeatureGroup parent = currentSubFeature.getParentFeature(); // if (parent != null) { // currentSubFeature.setParentFeature(null); // parent.removeFeature(currentFeature); // } // } if (!toRemove.contains(currentFeature)) { if (currentFeature instanceof FeatureGroup) { // delete group with all contained features toRemove.addAll(FeatureGroups.expandAll((FeatureGroup)currentFeature)); } else { toRemove.add(currentFeature); } } } getFeatureCollection().removeFeatures(toRemove); if (jxtFeatures.getRowCount() == firstSelectedRow) { firstSelectedRow--; } if (firstSelectedRow >= 0) { jxtFeatures.getSelectionModel().setSelectionInterval(firstSelectedRow, firstSelectedRow); } } //GEN-LAST:event_cmdRemoveFeaturesActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdZoomToFeaturesMouseExited(final java.awt.event.MouseEvent evt) { //GEN-FIRST:event_cmdZoomToFeaturesMouseExited // mappingComponent.outlineArea((BoundingBox)null); } //GEN-LAST:event_cmdZoomToFeaturesMouseExited /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdZoomToFeaturesActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdZoomToFeaturesActionPerformed mappingComponent.zoomToSelection(); } //GEN-LAST:event_cmdZoomToFeaturesActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdZoomToAllFeaturesActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdZoomToAllFeaturesActionPerformed mappingComponent.zoomToFeatureCollection(); } //GEN-LAST:event_cmdZoomToAllFeaturesActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdZoomToFeaturesMouseEntered(final java.awt.event.MouseEvent evt) { //GEN-FIRST:event_cmdZoomToFeaturesMouseEntered // int[] rows=jxtFeatures.getSelectedRows(); // Geometry g=null; // for (int i = 0; i < rows.length; i++) { // log.debug("rows["+i+"]="+rows[i]+" ,filter.mapTowardModel(rows[i])="+filter.mapTowardModel(rows[i])); // int mappedRow=mapRowToModel(rows[i]); // if (i==0) { // g=getFeatureCollection().getFeature(mappedRow).getGeometry().getEnvelope(); // } else { // g=g.getEnvelope().union(getFeatureCollection().getFeature(mappedRow).getGeometry().getEnvelope()); // } // } // if (g!=null) { // BoundingBox bb=new BoundingBox(g); // mappingComponent.outlineArea(bb); // } } //GEN-LAST:event_cmdZoomToFeaturesMouseEntered /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void togShowOnlyVisibleActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_togShowOnlyVisibleActionPerformed featureCollectionFilter.setArmed(togShowOnlyVisible.isSelected()); fireTableDataChanged(); } //GEN-LAST:event_togShowOnlyVisibleActionPerformed @Override public void shownMapBoundsChanged() { if (featureCollectionFilter.isArmed()) { fireTableDataChanged(); } } @Override public void featuresRemoved(final FeatureCollectionEvent fce) { fireTableDataChanged(); } @Override public void featuresChanged(final FeatureCollectionEvent fce) { final Collection<Feature> fc = fce.getFeatureCollection().getSelectedFeatures(); if (LOG.isDebugEnabled()) { LOG.debug("in featuresChanged: Selectedfeatures (" + fc.size() + ")" + fc, new CurrentStackTrace()); // NOI18N } fireTableDataChanged(); for (final Feature feat : fc) { final int index = getFeatureCollection().getAllFeatures().indexOf(feat); if (index != -1) { final int viewIndex = jxtFeatures.convertRowIndexToView(index); jxtFeatures.getSelectionModel().addSelectionInterval(viewIndex, viewIndex); if (LOG.isDebugEnabled()) { LOG.debug("SelectionIntervall added " + viewIndex); // NOI18N } } } } @Override public void featuresAdded(final FeatureCollectionEvent fce) { fireTableDataChanged(); } /** * DOCUMENT ME! */ private void fireTableDataChanged() { if (EventQueue.isDispatchThread()) { ((FeatureCollectionTableModel)jxtFeatures.getModel()).fireTableDataChanged(); } else { LOG.warn("fireTableDataChanged not in edt", new Exception()); EventQueue.invokeLater(new Thread("fireTableDatachanged in FeatureControl") { @Override public void run() { ((FeatureCollectionTableModel)FeatureControl.this.jxtFeatures.getModel()) .fireTableDataChanged(); } }); } } @Override public void featureSelectionChanged(final FeatureCollectionEvent fce) { try { addFeatureToSelection(fce.getFeatureCollection()); } catch (Exception e) { LOG.error("Error in featureSelectionChanged", e); // NOI18N } } /** * DOCUMENT ME! * * @param fc DOCUMENT ME! */ private void addFeatureToSelection(final FeatureCollection fc) { try { // ((FeatureCollectionTableModel)jxtFeatures.getModel()).fireTableDataChanged(); final Collection<Feature> features = fc.getSelectedFeatures(); jxtFeatures.getSelectionModel().removeListSelectionListener(theListSelectionListener); jxtFeatures.getSelectionModel().clearSelection(); if ((features != null) && (features.size() > 0)) { final Iterator<Feature> featureIt = features.iterator(); for (int i = 0; i < features.size(); ++i) { Feature current = featureIt.next(); if (!FeatureGroups.SHOW_GROUPING_ENABLED && (current instanceof SubFeature)) { final SubFeature sf = (SubFeature)current; current = FeatureGroups.getRootFeature(sf); } final int collectionIndex = fc.getAllFeatures().indexOf(current); if (collectionIndex != -1) { final int viewIndex = jxtFeatures.convertRowIndexToView(collectionIndex); jxtFeatures.getSelectionModel().addSelectionInterval(viewIndex, viewIndex); } } } else { jxtFeatures.scrollRowToVisible(0); } jxtFeatures.getSelectionModel().addListSelectionListener(theListSelectionListener); } catch (Exception e) { // TODO LOG.error("Error in addFeatureToSelection", e); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isWizardMode() { return wizardMode; } /** * DOCUMENT ME! * * @return Element */ @Override public Element getConfiguration() { try { final Element ret = new Element("cismapFeatureControl"); // NOI18N ret.setAttribute("showOnlyObjectsInMap", new Boolean(togShowOnlyVisible.isSelected()).toString()); // NOI18N ret.setAttribute("fixedMapExtent", new Boolean(togFixMapExtent.isSelected()).toString()); // NOI18N ret.setAttribute("fixedMapScale", new Boolean(togFixMapScale.isSelected()).toString()); // NOI18N ret.setAttribute("displayObjectInfo", new Boolean(togDisplayObjectInfo.isSelected()).toString()); // NOI18N ret.setAttribute("holdAll", new Boolean(togHoldAll.isSelected()).toString()); // NOI18N if (jxtFeatures.getSortedColumn() != null) { ret.setAttribute("sortedColumn", jxtFeatures.getSortedColumn().getIdentifier().toString()); // NOI18N final int viewIndex = jxtFeatures.convertColumnIndexToView(jxtFeatures.getSortedColumn() .getModelIndex()); ret.setAttribute( "ascendingSortOrder", new Boolean(jxtFeatures.getSortOrder(viewIndex).equals(SortOrder.ASCENDING)).toString()); // NOI18N } final Element columnSequence = new Element("columnSequence"); // NOI18N for (final Object tce : jxtFeatures.getColumns()) { columnSequence.addContent(new Element("id").addContent( ((TableColumnExt)tce).getIdentifier().toString())); // NOI18N } ret.addContent(columnSequence); for (final Object o : jxtFeatures.getColumns(true)) { final TableColumnExt tce = (TableColumnExt)o; final Element columnElement = new Element("column"); // NOI18N columnElement.setAttribute("title", tce.getTitle()); // NOI18N columnElement.setAttribute("identifier", tce.getIdentifier().toString()); // NOI18N columnElement.setAttribute("visible", new Boolean(tce.isVisible()).toString()); // NOI18N columnElement.setAttribute("width", "" + tce.getWidth()); // NOI18N // columnElement.setAttribute("sorterClass",tce.getSorter().); ret.addContent(columnElement); } return ret; } catch (Throwable t) { LOG.error("Error while creating configuration (application exit)", t); // NOI18N return new Element("cismapFeatureControl"); // NOI18N } } @Override public void masterConfigure(final Element e) { // wird alles lokal gespeichert und auch wieder abgerufen } @Override public void configure(final Element e) { try { final Element conf = e.getChild("cismapFeatureControl"); // NOI18N if (conf != null) { try { togShowOnlyVisible.setSelected(conf.getAttribute("showOnlyObjectsInMap").getBooleanValue()); // NOI18N } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } try { togFixMapExtent.setSelected(conf.getAttribute("fixedMapExtent").getBooleanValue()); // NOI18N } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } try { togFixMapScale.setSelected(conf.getAttribute("fixedMapScale").getBooleanValue()); // NOI18N } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } try { togDisplayObjectInfo.setSelected(conf.getAttribute("displayObjectInfo").getBooleanValue()); // NOI18N } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } try { togHoldAll.setSelected(conf.getAttribute("holdAll").getBooleanValue()); // NOI18N } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } try { final List seq = conf.getChild("columnSequence").getChildren("id"); // NOI18N final Object[] oa = new Object[seq.size()]; int i = 0; for (final Object elem : seq) { oa[i++] = ((Element)elem).getText(); if (LOG.isDebugEnabled()) { LOG.debug(oa[i - 1]); } } jxtFeatures.setColumnSequence(oa); } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } try { final String columnId = conf.getAttribute("sortedColumn").getValue(); // NOI18N final boolean ascending = conf.getAttribute("ascendingSortOrder").getBooleanValue(); // NOI18N final int viewIndex = jxtFeatures.convertColumnIndexToView(jxtFeatures.getColumn(columnId) .getModelIndex()); jxtFeatures.toggleSortOrder(viewIndex); if (!ascending) { jxtFeatures.toggleSortOrder(viewIndex); } } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } final List lst = conf.getChildren("column"); // NOI18N try { for (final Object elem : lst) { final Element col = (Element)elem; final Object id = col.getAttribute("identifier").getValue(); // NOI18N try { jxtFeatures.getColumnExt(id).setVisible(col.getAttribute("visible").getBooleanValue()); // NOI18N } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } try { jxtFeatures.getColumnExt(id).setPreferredWidth(col.getAttribute("width").getIntValue()); // NOI18N } catch (Exception ex) { LOG.warn("Error while reading configs", ex); // NOI18N } } } catch (Throwable t) { LOG.warn("Error while configuring featureControlComponent:", t); // NOI18N } featureCollectionFilter.setArmed(togShowOnlyVisible.isSelected()); mappingComponent.setInfoNodesVisible(togDisplayObjectInfo.isSelected()); mappingComponent.setFixedMapExtent(togFixMapExtent.isSelected()); mappingComponent.setFixedMapScale(togFixMapScale.isSelected()); mappingComponent.getFeatureCollection().setHoldAll(togHoldAll.isSelected()); } else { LOG.warn("No configurarion data for FeatureControl available."); // NOI18N } } catch (Throwable t) { LOG.error("Error while loading configuration (application start)", t); // NOI18N } } /** * DOCUMENT ME! */ private void tester() { for (final Object tce : jxtFeatures.getColumns()) { // log.debug(((TableColumnExt)tce).getSorter().getComparator()); } } @Override public void featureReconsiderationRequested(final FeatureCollectionEvent fce) { } @Override public void allFeaturesRemoved(final FeatureCollectionEvent fce) { fireTableDataChanged(); } @Override public void featureCollectionChanged() { } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class FeatureCollectionTableModel extends AbstractTableModel { //~ Methods ------------------------------------------------------------ /** * Sets the value in the cell at <code>columnIndex</code> and <code>rowIndex</code> to <code>aValue</code>. * * @param aValue the new public void selectionChanged(FeatureCollectionEvent fce) { } * * <p>public void featuresRemoved(FeatureCollectionEvent fce) { }</p> * * <p>public void featuresChanged(FeatureCollectionEvent fce) { }</p> * * <p>public void featuresAdded(FeatureCollectionEvent fce) { } value</p> * @param rowIndex the row whose value is to be changed * @param columnIndex the column whose value is to be changed * * @see #getValueAt * @see #isCellEditable */ @Override public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) { if ((columnIndex == 1) && ((Feature)getFeatureCollection().getFeature(rowIndex) instanceof AbstractNewFeature)) { ((AbstractNewFeature)(getFeatureCollection().getFeature(rowIndex))).setName(aValue.toString()); final Vector v = new Vector(); v.add(getFeatureCollection().getFeature(rowIndex)); ((DefaultFeatureCollection)mappingComponent.getFeatureCollection()).fireFeaturesChanged(v); } } /** * Returns the name of the column at <code>columnIndex</code>. This is used to initialize the table's column * header name. Note: this name does not need to be unique; two columns in a table can have the same name. * * @param columnIndex the index of the column * * @return the name of the column */ @Override public String getColumnName(final int columnIndex) { switch (columnIndex) { case 0: { // Icon return org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.getColumnName(int).return.ico"); // NOI18N } case 1: { // Name return org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.getColumnName(int).return.name"); // NOI18N } case 2: { // Type return org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.getColumnName(int).return.typ"); // NOI18N } case 3: { // Geometrietyp return org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.getColumnName(int).return.geometrie"); // NOI18N } case 4: { // Gr\u00F6\u00DFe return org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.getColumnName(int).return.groesse"); // NOI18N } case 5: { // L\u00E4nge return org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.getColumnName(int).return.laenge"); // NOI18N } case 6: { // Zentrum return org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.getColumnName(int).return.zentrum"); // NOI18N } case 7: { // Markierung return org.openide.util.NbBundle.getMessage( FeatureControl.class, "FeatureControl.getColumnName(int).return.Halten"); // NOI18N } default: { return ""; // NOI18N } } } /** * Returns true if the cell at <code>rowIndex</code> and <code>columnIndex</code> is editable. Otherwise, <code> * setValueAt</code> on the cell will not change the value of that cell. * * @param rowIndex the row whose value to be queried * @param columnIndex the column whose value to be queried * * @return true if the cell is editable * * @see #setValueAt */ @Override public boolean isCellEditable(final int rowIndex, final int columnIndex) { if ((columnIndex == 1) && ((Feature)getFeatureCollection().getFeature(rowIndex) instanceof AbstractNewFeature)) { return true; } else { return false; } } /** * Returns the value for the cell at <code>columnIndex</code> and <code>rowIndex</code>. * * @param rowIndex the row whose value is to be queried * @param columnIndex the column whose value is to be queried * * @return the value Object at the specified cell */ @Override public Object getValueAt(final int rowIndex, final int columnIndex) { try { final Feature f = (Feature)getFeatureCollection().getFeature(rowIndex); switch (columnIndex) { case 0: { // Icon if (f instanceof XStyledFeature) { return (Icon)(((XStyledFeature)f).getIconImage()); } else { return null; } } case 1: { // Name if (f instanceof XStyledFeature) { return ((XStyledFeature)f).getName(); } else { return f; } } case 2: { // Type if (f instanceof XStyledFeature) { return ((XStyledFeature)f).getType(); } else if (f instanceof FeatureGroup) { return "GRUPPE"; } else { return ""; // NOI18N } } case 3: { // Geometrietyp if (f.getGeometry() != null) { return f.getGeometry().getGeometryType(); } else { return ""; // NOI18N } } case 4: { // Gr\u00F6\u00DFe if (f.getGeometry() != null) { final Geometry geom = CrsTransformer.transformToMetricCrs(f.getGeometry(), mappingComponent.getCrsList()); return StaticDecimalTools.round(geom.getArea()); } else { return 0.0; } } case 5: { // L\u00E4nge if (f.getGeometry() != null) { final Geometry geom = CrsTransformer.transformToMetricCrs(f.getGeometry(), mappingComponent.getCrsList()); return StaticDecimalTools.round(geom.getLength()); } else { return 0.0; } } case 6: { // Zentrum if (f instanceof FeatureRendererAwareFeature) { final FeatureRenderer renderer = ((FeatureRendererAwareFeature)f).getFeatureRenderer(); if (renderer instanceof CoordHider) { // The coords should not be shown, if the feature renderer implements the CoordHider // interface return ""; } } if (f.getGeometry() != null) { final Geometry geom = CrsTransformer.transformToCurrentCrs(f.getGeometry()); final String pattern = (CismapBroker.getInstance().getSrs().isMetric() ? "0.00" : "0.000000"); return "(" + StaticDecimalTools.round(pattern, geom.getCentroid().getX()) + "," // NOI18N + StaticDecimalTools.round(pattern, geom.getCentroid().getY()) + ")"; // NOI18N } else { return 0.0; } } case 7: { // Markierung if (getFeatureCollection().isHoldFeature(f)) { return icoGreenled; } else { return null; } } default: { return null; } } } catch (Throwable t) { LOG.error("Error in table.", t); // NOI18N return null; } } /** * Returns the number of rows in the model. A <code>JTable</code> uses this method to determine how many rows it * should display. This method should be quick, as it is called frequently during rendering. * * @return the number of rows in the model * * @see #getColumnCount */ @Override public int getRowCount() { return (getFeatureCollection() != null) ? getFeatureCollection().getFeatureCount() : 0; } /** * Returns the number of columns in the model. A <code>JTable</code> uses this method to determine how many * columns it should create and display by default. * * @return the number of columns in the model * * @see #getRowCount */ @Override public int getColumnCount() { return 8; } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ final class SubFeatureFilter extends RowFilter<AbstractTableModel, Integer> { //~ Methods ------------------------------------------------------------ @Override public boolean include(final RowFilter.Entry entry) { final int modelRow = (Integer)entry.getIdentifier(); try { final Feature currentTestFeature = getFeatureCollection().getFeature(modelRow); if (currentTestFeature instanceof SubFeature) { return ((SubFeature)currentTestFeature).getParentFeature() == null; } return true; } catch (Throwable t) { LOG.error("Error while testing in filter", t); // NOI18N return true; } } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class FeatureCollectionFilter extends RowFilter<AbstractTableModel, Integer> { //~ Instance fields ---------------------------------------------------- private FeatureCollectionTableModel model; private boolean armed = false; //~ Constructors ------------------------------------------------------- /** * Creates a new FeatureCollectionFilter object. * * @param armed DOCUMENT ME! * @param model DOCUMENT ME! */ public FeatureCollectionFilter(final boolean armed, final FeatureCollectionTableModel model) { this.armed = armed; this.model = model; } //~ Methods ------------------------------------------------------------ @Override public boolean include(final RowFilter.Entry entry) { if (!armed) { return true; } else { final int modelRow = (Integer)entry.getIdentifier(); try { final Object value = getFeatureCollection().getFeature(modelRow); final PFeature pf = (PFeature)(mappingComponent.getPFeatureHM().get(value)); if (pf != null) { final PBounds all = mappingComponent.getCamera().getViewBounds(); final PDimension delta = all.deltaRequiredToContain(pf.getFullBounds()); mappingComponent.getCamera().viewToLocal(delta); final PDimension size = new PDimension(pf.getFullBounds().getSize()); mappingComponent.getCamera().viewToLocal(size); final boolean test = ((Math.abs(delta.width) <= size.width) && (Math.abs(delta.height) <= size.height)); return test; } else { return false; } } catch (Throwable t) { LOG.error("Error while testing in filter.", t); // NOI18N return true; } } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isArmed() { return armed; } /** * DOCUMENT ME! * * @param armed DOCUMENT ME! */ public void setArmed(final boolean armed) { this.armed = armed; model.fireTableDataChanged(); } } }