/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cismap.commons.gui.piccolo; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.LineSegment; import com.vividsolutions.jts.geom.LineString; import edu.umd.cs.piccolo.nodes.PPath; import java.awt.Color; import java.awt.Component; import java.awt.geom.Point2D; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; 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.PureNewFeature; import de.cismet.cismap.commons.features.XStyledFeature; import de.cismet.cismap.commons.gui.MappingComponent; import de.cismet.cismap.commons.interaction.CismapBroker; import de.cismet.tools.collections.HashArrayList; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @author jruiz * @version $Revision$, $Date$ */ public class AngleMeasurementDialog extends javax.swing.JDialog { //~ Static fields/initializers --------------------------------------------- private static final transient org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger( AngleMeasurementDialog.class); private static AngleMeasurementDialog INSTANCE = null; private static DecimalFormat FORMAT = new DecimalFormat("#0.00"); //~ Instance fields -------------------------------------------------------- private boolean mirrorAAllowed = false; private boolean mirrorBAllowed = false; private boolean mirrorA = false; private boolean mirrorB = false; private boolean showFeature = true; private boolean listSelectionListenerEnabled = true; private boolean featureCollectionListenerEnabled = true; private boolean initied = false; private final FeatureCollectionListModel featureCollectionListModel = new FeatureCollectionListModel(); private final ListSelectionListener listSelectionListener = new ListSelectionListener() { @Override public void valueChanged(final ListSelectionEvent e) { if (!e.getValueIsAdjusting() && isListSelectionListenerEnabled()) { applyListSelectionToMap(); doCalculateAngle(); } } }; private PPath tempFeature = null; private boolean initialMcReadonly = false; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCancel; private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel4; private javax.swing.JList jList1; private javax.swing.JList jList2; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JToggleButton jToggleButton1; private javax.swing.JToggleButton jToggleButton2; private javax.swing.JToggleButton jToggleButton3; private javax.swing.JPanel panButtons; private javax.swing.JPanel panParams; private javax.swing.JPanel panSide; // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates new form RectangleFromLineDialog. */ private AngleMeasurementDialog() { super(StaticSwingTools.getParentFrame(CismapBroker.getInstance().getMappingComponent()), false); initComponents(); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isListSelectionListenerEnabled() { return listSelectionListenerEnabled; } /** * DOCUMENT ME! * * @param listSelectionListenerEnabled DOCUMENT ME! */ public void setListSelectionListenerEnabled(final boolean listSelectionListenerEnabled) { this.listSelectionListenerEnabled = listSelectionListenerEnabled; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public MappingComponent getMappingComponent() { return CismapBroker.getInstance().getMappingComponent(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isFeatureCollectionListenerEnabled() { return featureCollectionListenerEnabled; } /** * DOCUMENT ME! * * @param featureCollectionListenerEnabled DOCUMENT ME! */ public void setFeatureCollectionListenerEnabled(final boolean featureCollectionListenerEnabled) { this.featureCollectionListenerEnabled = featureCollectionListenerEnabled; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static AngleMeasurementDialog getInstance() { if (INSTANCE == null) { INSTANCE = new AngleMeasurementDialog(); } return INSTANCE; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isMirrorAAllowed() { return mirrorAAllowed; } /** * DOCUMENT ME! * * @param mirrorAAllowed DOCUMENT ME! */ public void setMirrorAAllowed(final boolean mirrorAAllowed) { this.mirrorAAllowed = mirrorAAllowed; if (!mirrorAAllowed) { setMirrorA(false); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isMirrorBAllowed() { return mirrorBAllowed; } /** * DOCUMENT ME! * * @param mirrorBAllowed DOCUMENT ME! */ public void setMirrorBAllowed(final boolean mirrorBAllowed) { this.mirrorBAllowed = mirrorBAllowed; if (!mirrorBAllowed) { setMirrorB(false); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isShowFeature() { return showFeature; } /** * DOCUMENT ME! * * @param showFeature DOCUMENT ME! */ public void setShowFeature(final boolean showFeature) { this.showFeature = showFeature; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isMirrorA() { return isMirrorAAllowed() && mirrorA; } /** * DOCUMENT ME! * * @param mirrorA DOCUMENT ME! */ public void setMirrorA(final boolean mirrorA) { this.mirrorA = mirrorA; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isMirrorB() { return isMirrorBAllowed() && mirrorB; } /** * DOCUMENT ME! * * @param mirrorB DOCUMENT ME! */ public void setMirrorB(final boolean mirrorB) { this.mirrorB = mirrorB; } /** * 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. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; panParams = new javax.swing.JPanel(); panSide = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); jList1 = new javax.swing.JList(); jScrollPane2 = new javax.swing.JScrollPane(); jList2 = new javax.swing.JList(); jPanel2 = new javax.swing.JPanel(); jToggleButton2 = new javax.swing.JToggleButton(); jToggleButton1 = new javax.swing.JToggleButton(); jToggleButton3 = new javax.swing.JToggleButton(); jPanel3 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jButton2 = new javax.swing.JButton(); jPanel4 = new javax.swing.JPanel(); jLabel2 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); panButtons = new javax.swing.JPanel(); jPanel1 = new javax.swing.JPanel(); btnCancel = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle(org.openide.util.NbBundle.getMessage(AngleMeasurementDialog.class, "AngleMeasurementDialog.title")); // NOI18N setAlwaysOnTop(true); setMinimumSize(new java.awt.Dimension(450, 250)); setPreferredSize(new java.awt.Dimension(450, 250)); setResizable(false); getContentPane().setLayout(new java.awt.GridBagLayout()); panParams.setLayout(new java.awt.GridBagLayout()); panSide.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 25, 0)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panParams.add(panSide, gridBagConstraints); jLabel4.setFont(new java.awt.Font("Ubuntu", 1, 15)); // NOI18N jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel4.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jLabel4.text")); // NOI18N jLabel4.setVerticalAlignment(javax.swing.SwingConstants.TOP); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panParams.add(jLabel4, gridBagConstraints); jList1.setModel(featureCollectionListModel); jList1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jList1.setCellRenderer(new FeatureCollectionListCellRenderer()); jScrollPane1.setViewportView(jList1); jList1.getSelectionModel().addListSelectionListener(listSelectionListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridheight = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panParams.add(jScrollPane1, gridBagConstraints); jList2.setModel(featureCollectionListModel); jList2.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jList2.setCellRenderer(new FeatureCollectionListCellRenderer()); jScrollPane2.setViewportView(jList2); jList2.getSelectionModel().addListSelectionListener(listSelectionListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.gridheight = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panParams.add(jScrollPane2, gridBagConstraints); jPanel2.setLayout(new java.awt.GridBagLayout()); jToggleButton2.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/Angle-Thingy-icon.png"))); // NOI18N jToggleButton2.setSelected(true); jToggleButton2.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jToggleButton2.text")); // NOI18N jToggleButton2.setFocusPainted(false); jToggleButton2.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { jToggleButton2ActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH; gridBagConstraints.weightx = 0.2; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1); jPanel2.add(jToggleButton2, gridBagConstraints); jToggleButton1.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/layer-flip.png"))); // NOI18N jToggleButton1.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jToggleButton1.text")); // NOI18N jToggleButton1.setToolTipText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jToggleButton1.toolTipText")); // NOI18N jToggleButton1.setDisabledIcon(null); jToggleButton1.setFocusPainted(false); jToggleButton1.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { jToggleButton1ActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.1; gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1); jPanel2.add(jToggleButton1, gridBagConstraints); jToggleButton3.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/layer-flip-vertical.png"))); // NOI18N jToggleButton3.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jToggleButton3.text")); // NOI18N jToggleButton3.setToolTipText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jToggleButton3.toolTipText")); // NOI18N jToggleButton3.setDisabledIcon(null); jToggleButton3.setFocusPainted(false); jToggleButton3.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { jToggleButton3ActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.1; gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1); jPanel2.add(jToggleButton3, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_END; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panParams.add(jPanel2, gridBagConstraints); jPanel3.setLayout(new java.awt.GridBagLayout()); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jLabel1.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(5, 0, 5, 5); jPanel3.add(jLabel1, gridBagConstraints); jButton2.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/layer-shape-line-crossed.png"))); // NOI18N jButton2.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jButton2.text")); // NOI18N jButton2.setToolTipText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jButton2.toolTipText")); // NOI18N jButton2.setBorderPainted(false); jButton2.setContentAreaFilled(false); jButton2.setDisabledIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/layer-shape-line.png"))); // NOI18N jButton2.setEnabled(false); jButton2.setFocusPainted(false); jButton2.setFocusable(false); jButton2.setRequestFocusEnabled(false); jButton2.setRolloverEnabled(false); jButton2.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; jPanel3.add(jButton2, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; panParams.add(jPanel3, gridBagConstraints); jPanel4.setLayout(new java.awt.GridBagLayout()); jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jLabel2.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(5, 0, 5, 5); jPanel4.add(jLabel2, gridBagConstraints); jButton1.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/layer-shape-line-crossed.png"))); // NOI18N jButton1.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jButton1.text")); // NOI18N jButton1.setToolTipText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.jButton1.toolTipText")); // NOI18N jButton1.setBorderPainted(false); jButton1.setContentAreaFilled(false); jButton1.setDisabledIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/layer-shape-line.png"))); // NOI18N jButton1.setEnabled(false); jButton1.setFocusPainted(false); jButton1.setFocusable(false); jButton1.setRequestFocusEnabled(false); jButton1.setRolloverEnabled(false); jButton1.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; jPanel4.add(jButton1, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; panParams.add(jPanel4, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; getContentPane().add(panParams, gridBagConstraints); jPanel1.setLayout(new java.awt.GridLayout(1, 0, 5, 0)); btnCancel.setText(org.openide.util.NbBundle.getMessage( AngleMeasurementDialog.class, "AngleMeasurementDialog.btnCancel.text_2")); // NOI18N btnCancel.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { btnCancelActionPerformed(evt); } }); jPanel1.add(btnCancel); panButtons.add(jPanel1); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; getContentPane().add(panButtons, gridBagConstraints); pack(); } // </editor-fold>//GEN-END:initComponents /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void btnCancelActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnCancelActionPerformed dispose(); } //GEN-LAST:event_btnCancelActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void jToggleButton2ActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jToggleButton2ActionPerformed setShowFeature(jToggleButton2.isSelected()); if (tempFeature != null) { if (isShowFeature()) { getMappingComponent().getTmpFeatureLayer().addChild(tempFeature); } else { try { getMappingComponent().getTmpFeatureLayer().removeChild(tempFeature); } catch (final Exception ex) { } } } refreshButtons(); } //GEN-LAST:event_jToggleButton2ActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void jToggleButton1ActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jToggleButton1ActionPerformed setMirrorA(jToggleButton1.isSelected()); doCalculateAngle(); } //GEN-LAST:event_jToggleButton1ActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void jToggleButton3ActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jToggleButton3ActionPerformed setMirrorB(jToggleButton3.isSelected()); doCalculateAngle(); } //GEN-LAST:event_jToggleButton3ActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void jButton1ActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jButton1ActionPerformed final Feature feature = (Feature)jList1.getSelectedValue(); getMappingComponent().getFeatureCollection().removeFeature(feature); } //GEN-LAST:event_jButton1ActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void jButton2ActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jButton2ActionPerformed final Feature feature = (Feature)jList2.getSelectedValue(); getMappingComponent().getFeatureCollection().removeFeature(feature); } //GEN-LAST:event_jButton2ActionPerformed @Override public void dispose() { setFeatureCollectionListenerEnabled(false); try { getMappingComponent().getTmpFeatureLayer().removeChild(tempFeature); } catch (final Exception ex) { } featureCollectionListModel.clear(); getMappingComponent().setReadOnly(initialMcReadonly); tempFeature = null; super.dispose(); } /** * DOCUMENT ME! */ private void refreshButtons() { jToggleButton2.setSelected(isShowFeature()); jToggleButton1.setSelected(isShowFeature() && isMirrorA()); jToggleButton1.setEnabled(isMirrorAAllowed() && isShowFeature() && (tempFeature != null)); jToggleButton3.setSelected(isShowFeature() && isMirrorB()); jToggleButton3.setEnabled(isMirrorBAllowed() && isShowFeature() && (tempFeature != null)); jButton1.setEnabled(jList1.getSelectedValue() instanceof PureNewFeature); jButton2.setEnabled(jList2.getSelectedValue() instanceof PureNewFeature); } @Override public void setVisible(final boolean b) { initialMcReadonly = getMappingComponent().isReadOnly(); getMappingComponent().setReadOnly(false); super.setVisible(b); if (b) { setFeatureCollectionListenerEnabled(true); featureCollectionListModel.refresh(); } if (isShowFeature() && (tempFeature != null)) { getMappingComponent().getTmpFeatureLayer().addChild(tempFeature); } refreshButtons(); } /** * DOCUMENT ME! */ private void doCalculateAngle() { final Feature featureA = (Feature)jList1.getSelectedValue(); final Feature featureB = (Feature)jList2.getSelectedValue(); try { getMappingComponent().getTmpFeatureLayer().removeChild(tempFeature); } catch (final Exception ex) { } if ((featureA == null) || !checkForSegment(featureA.getGeometry()) || (featureB == null) || !checkForSegment(featureB.getGeometry())) { return; } final LineString geomA = (LineString)featureA.getGeometry(); final LineString geomB = (LineString)featureB.getGeometry(); final LineSegment segA = new LineSegment(geomA.getCoordinateN(0), geomA.getCoordinateN(1)); final LineSegment segB = new LineSegment(geomB.getCoordinateN(0), geomB.getCoordinateN(1)); final Coordinate intersection = segA.lineIntersection(segB); if (intersection != null) { final boolean intersectsA = segA.distance(intersection) < 0.01; final boolean intersectsB = segB.distance(intersection) < 0.01; setMirrorAAllowed(intersectsA); setMirrorBAllowed(intersectsB); final Coordinate cA0 = (intersection.distance(segA.getCoordinate(0)) > intersection.distance(segA.getCoordinate(1))) ? segA.getCoordinate(0) : segA.getCoordinate(1); final Coordinate cA1 = (intersection.distance(segA.getCoordinate(0)) > intersection.distance(segA.getCoordinate(1))) ? segA.getCoordinate(1) : segA.getCoordinate(0); final Coordinate cB0 = (intersection.distance(segB.getCoordinate(0)) > intersection.distance(segB.getCoordinate(1))) ? segB.getCoordinate(0) : segB.getCoordinate(1); final Coordinate cB1 = (intersection.distance(segB.getCoordinate(0)) > intersection.distance(segB.getCoordinate(1))) ? segB.getCoordinate(1) : segB.getCoordinate(0); final Coordinate cA; final Coordinate cB; if (!isMirrorA()) { cA = cA0; } else { cA = cA1; } if (!isMirrorB()) { cB = cB0; } else { cB = cB1; } final LineSegment interSegA = new LineSegment(intersection, cA); final LineSegment interSegB = new LineSegment(intersection, cB); double angle; if (interSegA.angle() > interSegB.angle()) { angle = Math.toDegrees(interSegA.angle()) - Math.toDegrees(interSegB.angle()); } else { angle = Math.toDegrees(interSegB.angle()) - Math.toDegrees(interSegA.angle()); } if (angle > 180) { angle = 360 - angle; } tempFeature = createNewTempFeature(); tempFeature.setPathToPolyline( new Point2D[] { new Point2D.Double( getMappingComponent().getWtst().getScreenX(cA.x), getMappingComponent().getWtst().getScreenY(cA.y)), new Point2D.Double( getMappingComponent().getWtst().getScreenX(intersection.x), getMappingComponent().getWtst().getScreenY(intersection.y)), new Point2D.Double( getMappingComponent().getWtst().getScreenX(cB.x), getMappingComponent().getWtst().getScreenY(cB.y)) }); if (isShowFeature()) { getMappingComponent().getTmpFeatureLayer().addChild(tempFeature); } jLabel4.setText(FORMAT.format(angle) + " °"); } else { setMirrorAAllowed(false); setMirrorBAllowed(false); tempFeature = null; jLabel4.setText("∞ °"); } refreshButtons(); } /** * DOCUMENT ME! * * @param args the command line arguments */ public static void main(final String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { final AngleMeasurementDialog dialog = new AngleMeasurementDialog(); dialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(final java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } }); } /** * DOCUMENT ME! * * @param geom DOCUMENT ME! * * @return DOCUMENT ME! */ public static boolean checkForSegment(final Geometry geom) { return ((geom instanceof LineString) && (geom.getNumPoints() == 2)); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ protected PPath createNewTempFeature() { final PPath newTempFeaturePath = new PPath(); newTempFeaturePath.setStroke(new FixedWidthStroke()); final Color fillingColor = Color.BLUE; newTempFeaturePath.setStrokePaint(fillingColor); newTempFeaturePath.setPaint(fillingColor); newTempFeaturePath.setTransparency(0.2f); return newTempFeaturePath; } /** * DOCUMENT ME! */ private void applyListSelectionToMap() { final Feature feature1 = (Feature)jList1.getSelectedValue(); final Feature feature2 = (Feature)jList2.getSelectedValue(); final Collection<Feature> featuresToSelect = new ArrayList<Feature>(); if ((feature1 != null) && getMappingComponent().getFeatureCollection().contains(feature1)) { featuresToSelect.add(feature1); } if ((feature2 != null) && getMappingComponent().getFeatureCollection().contains(feature2)) { featuresToSelect.add(feature2); } setFeatureCollectionListenerEnabled(false); try { getMappingComponent().getFeatureCollection().select(featuresToSelect); } finally { setFeatureCollectionListenerEnabled(true); } } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class FeatureCollectionListModel extends DefaultListModel<Feature> { //~ Instance fields ---------------------------------------------------- private final List<Feature> segmentFeatures = new HashArrayList<Feature>(); private final FeatureCollectionListener featureCollectionListener = new FeatureCollectionListener() { @Override public void featuresAdded(final FeatureCollectionEvent fce) { try { if (isFeatureCollectionListenerEnabled() && isVisible()) { boolean changed = false; for (final Feature feature : filterSegments(fce.getEventFeatures())) { if (!segmentFeatures.contains(feature)) { segmentFeatures.add(feature); changed = true; } } if (changed) { fireContentChanged(); } } } catch (final Exception ex) { LOG.warn("error while featuresAdded", ex); } } @Override public void allFeaturesRemoved(final FeatureCollectionEvent fce) { try { if (isFeatureCollectionListenerEnabled() && isVisible()) { if (!segmentFeatures.isEmpty()) { jList1.clearSelection(); jList2.clearSelection(); segmentFeatures.clear(); fireContentChanged(); } } } catch (final Exception ex) { LOG.warn("error while allFeaturesRemoved", ex); } } @Override public void featuresRemoved(final FeatureCollectionEvent fce) { try { if (isFeatureCollectionListenerEnabled() && isVisible()) { boolean changed = false; for (final Feature segment : filterSegments(fce.getEventFeatures())) { if (segmentFeatures.contains(segment)) { if (segment.equals(jList1.getSelectedValue())) { jList1.clearSelection(); } if (segment.equals(jList2.getSelectedValue())) { jList2.clearSelection(); } segmentFeatures.remove(segment); changed = true; } } if (changed) { fireContentChanged(); } } } catch (final Exception ex) { LOG.warn("error while featuresRemoved", ex); } } @Override public void featuresChanged(final FeatureCollectionEvent fce) { try { if (isFeatureCollectionListenerEnabled() && isVisible()) { boolean changed = false; for (final Feature feature : fce.getEventFeatures()) { if (fce.getFeatureCollection().contains(feature) && fce.getEventFeatures().contains(feature)) { if (segmentFeatures.contains(feature) && !checkForSegment(feature.getGeometry())) { if (feature.equals(jList1.getSelectedValue())) { jList1.clearSelection(); } if (feature.equals(jList2.getSelectedValue())) { jList2.clearSelection(); } segmentFeatures.remove(feature); changed = true; } else if (!segmentFeatures.contains(feature) && checkForSegment(feature.getGeometry())) { segmentFeatures.add(feature); changed = true; } else if (feature.equals(jList1.getSelectedValue()) || feature.equals(jList2.getSelectedValue())) { doCalculateAngle(); } } } if (changed) { SwingUtilities.invokeLater(new Thread("AngleMeasurementDialog featuresChanged()") { @Override public void run() { fireContentChanged(); } }); } } } catch (final Exception ex) { LOG.warn("error while featuresChanged", ex); } } @Override public void featureSelectionChanged(final FeatureCollectionEvent fce) { try { if (isFeatureCollectionListenerEnabled() && isVisible()) { selectListFromFeatureCollection(getMappingComponent().getFeatureCollection()); } } catch (final Exception ex) { LOG.warn("error while featureSelectionChanged", ex); } } @Override public void featureReconsiderationRequested(final FeatureCollectionEvent fce) { try { if (isFeatureCollectionListenerEnabled() && isVisible()) { } } catch (final Exception ex) { LOG.warn("error while featureReconsiderationRequested", ex); } } @Override public void featureCollectionChanged() { try { if (isFeatureCollectionListenerEnabled() && isVisible()) { } } catch (final Exception ex) { LOG.warn("error while featureCollectionChanged", ex); } } }; //~ Constructors ------------------------------------------------------- /** * Creates a new FeatureCollectionComboBoxModel object. */ public FeatureCollectionListModel() { getMappingComponent().getFeatureCollection().addFeatureCollectionListener(featureCollectionListener); } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! */ public void refresh() { segmentFeatures.clear(); segmentFeatures.addAll(filterSegments(getMappingComponent().getFeatureCollection().getAllFeatures())); fireContentChanged(); selectListFromFeatureCollection(getMappingComponent().getFeatureCollection()); } /** * DOCUMENT ME! * * @param allFeatures DOCUMENT ME! * * @return DOCUMENT ME! */ public final Collection<Feature> filterSegments(final Collection<Feature> allFeatures) { final Collection<Feature> filtredFeatures = new ArrayList<Feature>(); for (final Feature potentialSegment : allFeatures) { final Geometry geom = potentialSegment.getGeometry(); if (checkForSegment(geom)) { filtredFeatures.add(potentialSegment); } } return filtredFeatures; } /** * DOCUMENT ME! * * @param featureCollection DOCUMENT ME! */ private void selectListFromFeatureCollection(final FeatureCollection featureCollection) { final Collection<Feature> features = featureCollection.getSelectedFeatures(); final List<Feature> selectedSegmentFeatures = new ArrayList<Feature>(); for (final Feature feature : features) { if (segmentFeatures.contains(feature)) { selectedSegmentFeatures.add(feature); } } if (selectedSegmentFeatures.size() == 1) { setListSelectionListenerEnabled(false); try { jList1.setSelectedValue(selectedSegmentFeatures.get(0), true); jList2.clearSelection(); } finally { setListSelectionListenerEnabled(true); } } else if (selectedSegmentFeatures.size() == 2) { final Feature featureA = selectedSegmentFeatures.get(0); final Feature featureB = selectedSegmentFeatures.get(1); setListSelectionListenerEnabled(false); try { jList1.setSelectedValue(featureA, true); jList2.setSelectedValue(featureB, true); } finally { setListSelectionListenerEnabled(true); } } else { setListSelectionListenerEnabled(false); try { jList1.clearSelection(); jList2.clearSelection(); } finally { setListSelectionListenerEnabled(true); } } doCalculateAngle(); } /** * DOCUMENT ME! */ private void fireContentChanged() { fireContentsChanged(this, 0, getSize() - 1); if (getSize() == 2) { setListSelectionListenerEnabled(false); try { jList1.setSelectedIndex(0); jList2.setSelectedIndex(1); } finally { setListSelectionListenerEnabled(true); } applyListSelectionToMap(); doCalculateAngle(); } } @Override public Feature getElementAt(final int index) { if ((index < 0) || (index >= getSize())) { return null; } return segmentFeatures.get(index); } @Override public int getSize() { return segmentFeatures.size(); } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class FeatureCollectionListCellRenderer extends DefaultListCellRenderer { //~ Methods ------------------------------------------------------------ @Override public Component getListCellRendererComponent(final JList<?> list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { final Component superComp = super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); if ((value instanceof XStyledFeature) && (superComp instanceof JLabel)) { ((JLabel)superComp).setText(((XStyledFeature)value).getName()); } return superComp; } } }