/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * AddHandleDialog.java * * Created on 05.11.2009, 15:38:03 */ package de.cismet.cismap.commons.gui.piccolo; import java.awt.Graphics; import java.awt.Image; import javax.swing.JSlider; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.plaf.basic.BasicSliderUI; import de.cismet.cismap.commons.interaction.CismapBroker; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @author jruiz * @version $Revision$, $Date$ */ public class AddHandleDialog extends javax.swing.JDialog { //~ Static fields/initializers --------------------------------------------- public static final int STATUS_NONE = -1; public static final int STATUS_OK = 0; public static final int STATUS_CANCELED = 1; private static final double PRECISION = 100; // => "1/PRECISION" private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AddHandleDialog.class); private static final AddHandleDialog INSTANCE = new AddHandleDialog(); //~ Instance fields -------------------------------------------------------- private int returnStatus = STATUS_NONE; private boolean allLocked = false; private boolean sliderLocked = false; private boolean updateLeftLocked = false; private boolean updateRightLocked = false; private double distanceToLeft = 0d; private double distanceTotal; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCancel; private javax.swing.JButton btnOK; private javax.swing.JButton jButton1; private javax.swing.JPanel jPanel1; private javax.swing.JSpinner jSpinner1; private javax.swing.JSpinner jSpinner2; private javax.swing.JLabel lblDescription; private javax.swing.JLabel lblDescriptionImage; private javax.swing.JLabel lblDistanceLeft; private javax.swing.JLabel lblLeftNeighbour; private javax.swing.JLabel lblLeftPoint; private javax.swing.JLabel lblRightDistance; private javax.swing.JLabel lblRightNeighbour; private javax.swing.JLabel lblRightPoint; private javax.swing.JPanel panButtons; private javax.swing.JPanel panFooter; private javax.swing.JSlider sliDistance; // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates new form AddHandleDialog. */ private AddHandleDialog() { super(StaticSwingTools.getParentFrame(CismapBroker.getInstance().getMappingComponent()), true); allLocked = true; initComponents(); sliDistance.setUI(new mySliderUI(sliDistance)); getRootPane().setDefaultButton(btnOK); pack(); allLocked = false; } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static AddHandleDialog getInstance() { return INSTANCE; } /** * 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; jPanel1 = new javax.swing.JPanel(); sliDistance = new javax.swing.JSlider(); lblLeftNeighbour = new javax.swing.JLabel(); lblRightNeighbour = new javax.swing.JLabel(); lblDistanceLeft = new javax.swing.JLabel(); lblRightDistance = new javax.swing.JLabel(); lblLeftPoint = new javax.swing.JLabel(); lblRightPoint = new javax.swing.JLabel(); panFooter = new javax.swing.JPanel(); lblDescriptionImage = new javax.swing.JLabel(); lblDescription = new javax.swing.JLabel(); jSpinner1 = new javax.swing.JSpinner(); jSpinner2 = new javax.swing.JSpinner(); jButton1 = new javax.swing.JButton(); panButtons = new javax.swing.JPanel(); btnOK = new javax.swing.JButton(); btnCancel = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle(org.openide.util.NbBundle.getMessage(AddHandleDialog.class, "AddHandleDialog.title")); // NOI18N setResizable(false); getContentPane().setLayout(new java.awt.GridBagLayout()); jPanel1.setLayout(new java.awt.GridBagLayout()); sliDistance.setMajorTickSpacing((int)PRECISION); sliDistance.setValue(0); sliDistance.setFocusable(false); sliDistance.setMaximumSize(new java.awt.Dimension(206, 54)); sliDistance.setMinimumSize(new java.awt.Dimension(206, 54)); sliDistance.addChangeListener(new javax.swing.event.ChangeListener() { @Override public void stateChanged(final javax.swing.event.ChangeEvent evt) { sliDistanceStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; jPanel1.add(sliDistance, gridBagConstraints); lblLeftNeighbour.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); lblLeftNeighbour.setText(org.openide.util.NbBundle.getMessage( AddHandleDialog.class, "AddHandleDialog.lblLeftNeighbour.text")); // NOI18N lblLeftNeighbour.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); lblLeftNeighbour.setMaximumSize(new java.awt.Dimension(150, 17)); lblLeftNeighbour.setMinimumSize(new java.awt.Dimension(150, 17)); lblLeftNeighbour.setPreferredSize(new java.awt.Dimension(150, 17)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_START; jPanel1.add(lblLeftNeighbour, gridBagConstraints); lblRightNeighbour.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); lblRightNeighbour.setText(org.openide.util.NbBundle.getMessage( AddHandleDialog.class, "AddHandleDialog.lblRightNeighbour.text")); // NOI18N lblRightNeighbour.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); lblRightNeighbour.setMaximumSize(new java.awt.Dimension(150, 17)); lblRightNeighbour.setMinimumSize(new java.awt.Dimension(150, 17)); lblRightNeighbour.setPreferredSize(new java.awt.Dimension(150, 17)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_END; jPanel1.add(lblRightNeighbour, gridBagConstraints); lblDistanceLeft.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); lblDistanceLeft.setText(org.openide.util.NbBundle.getMessage( AddHandleDialog.class, "AddHandleDialog.lblDistanceLeft.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0); jPanel1.add(lblDistanceLeft, gridBagConstraints); lblRightDistance.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); lblRightDistance.setText(org.openide.util.NbBundle.getMessage( AddHandleDialog.class, "AddHandleDialog.lblDistanceRight.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0); jPanel1.add(lblRightDistance, gridBagConstraints); lblLeftPoint.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); lblLeftPoint.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/neighbourPoint.png"))); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0); jPanel1.add(lblLeftPoint, gridBagConstraints); lblRightPoint.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); lblRightPoint.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/neighbourPoint.png"))); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 6; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0); jPanel1.add(lblRightPoint, gridBagConstraints); panFooter.setLayout(new java.awt.GridBagLayout()); lblDescriptionImage.setText(org.openide.util.NbBundle.getMessage( AddHandleDialog.class, "AddHandleDialog.lblDescriptionImage.text")); // NOI18N lblDescriptionImage.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); lblDescriptionImage.setPreferredSize(new java.awt.Dimension(250, 120)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); panFooter.add(lblDescriptionImage, gridBagConstraints); lblDescription.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/addHandle.png"))); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5); panFooter.add(lblDescription, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 0, 0, 0); jPanel1.add(panFooter, gridBagConstraints); jSpinner1.setModel(new javax.swing.SpinnerNumberModel( Double.valueOf(0.0d), Double.valueOf(0.0d), null, Double.valueOf(1.0d))); jSpinner1.setMinimumSize(new java.awt.Dimension(75, 26)); jSpinner1.setPreferredSize(new java.awt.Dimension(75, 26)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_END; gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0); jPanel1.add(jSpinner1, gridBagConstraints); ((JSpinner.DefaultEditor)jSpinner1.getEditor()).getTextField() .getDocument() .addDocumentListener(new LeftDocumentListener()); jSpinner2.setModel(new javax.swing.SpinnerNumberModel( Double.valueOf(0.0d), Double.valueOf(0.0d), null, Double.valueOf(1.0d))); jSpinner2.setMinimumSize(new java.awt.Dimension(75, 26)); jSpinner2.setPreferredSize(new java.awt.Dimension(75, 26)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_END; gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0); jPanel1.add(jSpinner2, gridBagConstraints); ((JSpinner.DefaultEditor)jSpinner2.getEditor()).getTextField() .getDocument() .addDocumentListener(new RightDocumentListener()); jButton1.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/piccolo/arrow-step.png"))); // NOI18N jButton1.setText(org.openide.util.NbBundle.getMessage(AddHandleDialog.class, "AddHandleDialog.jButton1.text")); // NOI18N jButton1.setToolTipText(org.openide.util.NbBundle.getMessage( AddHandleDialog.class, "AddHandleDialog.jButton1.toolTipText")); // NOI18N 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 = 3; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_END; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 10); jPanel1.add(jButton1, gridBagConstraints); panButtons.setLayout(new java.awt.GridLayout(1, 0, 10, 0)); btnOK.setText(org.openide.util.NbBundle.getMessage(AddHandleDialog.class, "AddHandleDialog.btnOK.text")); // NOI18N btnOK.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { btnOKActionPerformed(evt); } }); panButtons.add(btnOK); btnCancel.setText(org.openide.util.NbBundle.getMessage( AddHandleDialog.class, "AddHandleDialog.btnCancel.text")); // NOI18N btnCancel.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { btnCancelActionPerformed(evt); } }); panButtons.add(btnCancel); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 7; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST; jPanel1.add(panButtons, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); getContentPane().add(jPanel1, gridBagConstraints); pack(); } // </editor-fold>//GEN-END:initComponents /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void btnOKActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnOKActionPerformed returnStatus = STATUS_OK; dispose(); } //GEN-LAST:event_btnOKActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void btnCancelActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnCancelActionPerformed returnStatus = STATUS_CANCELED; dispose(); } //GEN-LAST:event_btnCancelActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void sliDistanceStateChanged(final javax.swing.event.ChangeEvent evt) { //GEN-FIRST:event_sliDistanceStateChanged sliderValueChanged(); } //GEN-LAST:event_sliDistanceStateChanged /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void jButton1ActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jButton1ActionPerformed setDistanceToLeft(distanceTotal / 2d); } //GEN-LAST:event_jButton1ActionPerformed /** * DOCUMENT ME! * * @param value DOCUMENT ME! * * @return DOCUMENT ME! */ private double cut(final double value) { return (int)(value * PRECISION) / PRECISION; } /** * DOCUMENT ME! */ private void sliderValueChanged() { // update für den Slider kurzfristig deaktivieren (sonst endlos-Schleife) sliderLocked = true; try { setDistanceToLeft((sliDistance.getValue() / (double)sliDistance.getMaximum()) * distanceTotal); } finally { // update für den Slider wieder aktivieren sliderLocked = false; } } /** * DOCUMENT ME! * * @param distanceToLeft DOCUMENT ME! */ public void setDistanceToLeft(final double distanceToLeft) { if (!allLocked) { // Ungenauigkeit durch Rückkopplung vermeiden // (Rückkopplung = setzen auf genauen wert löst das setzen // des gerundeten spinners ein, welches das setzen eines // ungenauen werts durchsetzt. allLocked = true; this.distanceToLeft = distanceToLeft; try { if (!sliderLocked) { // Endlos-Schleife vermeiden sliDistance.setValue((int)((this.distanceToLeft / this.distanceTotal) * sliDistance.getMaximum())); } if (!updateLeftLocked) { // Endlos-Schleife vermeiden jSpinner1.setValue(cut(this.distanceToLeft)); } if (!updateRightLocked) { // Endlos-Schleife vermeiden jSpinner2.setValue(cut(this.distanceTotal) - cut(this.distanceToLeft)); } } finally { allLocked = false; } } } /** * DOCUMENT ME! * * @param distanceToRight DOCUMENT ME! */ public void setDistanceToRight(final double distanceToRight) { setDistanceToLeft(this.distanceTotal - distanceToRight); } /** * DOCUMENT ME! */ private void leftTextChanged() { // update für das linke Feld kurzfristig deaktivieren (sonst endlos-Schleife) updateLeftLocked = true; try { final double value = (Double)jSpinner1.getValue(); if (cut(this.distanceToLeft) != value) { // Abstand vom linken Punkt anhand des linken Feldes setzen setDistanceToLeft(value); } } finally { // update für das linke Feld wieder aktivieren updateLeftLocked = false; } } /** * DOCUMENT ME! */ private void rightTextChanged() { // update für das rechte Feld kurzfristig deaktivieren (sonst endlos-Schleife) updateRightLocked = true; try { final double value = (Double)jSpinner2.getValue(); if (cut(getDistanceToRight()) != value) { // Abstand vom linken Punkt anhand des Wertes im linken Feld berechnen setDistanceToRight(value); } } finally { // update für das rechte Feld wieder aktivieren updateRightLocked = false; } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int getReturnStatus() { return returnStatus; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public double getDistanceTotal() { return distanceTotal; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public double getDistanceToLeft() { return distanceToLeft; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public double getDistanceToRight() { return this.distanceTotal - this.distanceToLeft; } /** * DOCUMENT ME! * * @param distanceTotal DOCUMENT ME! */ public void setDistanceTotal(final double distanceTotal) { // sliDistance.setMaximum((int)(distanceTotal * PRECISION)); this.distanceTotal = distanceTotal; allLocked = true; try { sliDistance.setMaximum(sliDistance.getWidth()); ((SpinnerNumberModel)jSpinner1.getModel()).setMaximum(distanceTotal); ((SpinnerNumberModel)jSpinner2.getModel()).setMaximum(distanceTotal); } finally { allLocked = false; } setDistanceToLeft(distanceTotal / 2d); } /** * 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 AddHandleDialog dialog = getInstance(); dialog.pack(); dialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(final java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } }); } @Override public void setVisible(final boolean visible) { super.setVisible(visible); } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class LeftDocumentListener implements DocumentListener { //~ Methods ------------------------------------------------------------ @Override public void insertUpdate(final DocumentEvent e) { leftTextChanged(); } @Override public void removeUpdate(final DocumentEvent e) { leftTextChanged(); } @Override public void changedUpdate(final DocumentEvent e) { leftTextChanged(); } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class RightDocumentListener implements DocumentListener { //~ Methods ------------------------------------------------------------ @Override public void insertUpdate(final DocumentEvent e) { rightTextChanged(); } @Override public void removeUpdate(final DocumentEvent e) { rightTextChanged(); } @Override public void changedUpdate(final DocumentEvent e) { rightTextChanged(); } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class mySliderUI extends BasicSliderUI { //~ Instance fields ---------------------------------------------------- private final Image newPointImage; //~ Constructors ------------------------------------------------------- /** * Creates a new mySliderUI object. * * @param aSlider DOCUMENT ME! */ public mySliderUI(final JSlider aSlider) { super(aSlider); this.newPointImage = new javax.swing.ImageIcon(getClass().getResource( "/de/cismet/cismap/commons/gui/piccolo/newPoint.png")).getImage(); } //~ Methods ------------------------------------------------------------ @Override public void paintThumb(final Graphics g) { g.drawImage(this.newPointImage, thumbRect.x, thumbRect.y, 8, 8, null); } } }