Revision: 3327
Author: jfuerth
Date: Tue Feb 23 09:40:54 2010
Log: Now clicking on labels beside radio buttons and checkboxes has the same effect as clicking on them directly. Thanks to Thomas Kellerer for pointing out the problem.
http://code.google.com/p/power-architect/source/detail?r=3327

Modified:
 /trunk/src/ca/sqlpower/architect/swingui/CompareDMPanel.java

=======================================
--- /trunk/src/ca/sqlpower/architect/swingui/CompareDMPanel.java Mon Feb 22 08:44:13 2010 +++ /trunk/src/ca/sqlpower/architect/swingui/CompareDMPanel.java Tue Feb 23 09:40:54 2010
@@ -19,12 +19,16 @@
 package ca.sqlpower.architect.swingui;

 import java.awt.BorderLayout;
+import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
+import java.awt.Point;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -35,6 +39,7 @@
 import java.util.List;

 import javax.swing.AbstractAction;
+import javax.swing.AbstractButton;
 import javax.swing.Action;
 import javax.swing.ButtonGroup;
 import javax.swing.JButton;
@@ -48,6 +53,7 @@
 import javax.swing.JRadioButton;
 import javax.swing.JTextField;
 import javax.swing.ListCellRenderer;
+import javax.swing.SwingUtilities;
 import javax.swing.event.AncestorEvent;
 import javax.swing.event.AncestorListener;
 import javax.swing.event.DocumentEvent;
@@ -764,20 +770,24 @@

                        updatePlayPenNameLabel();

+                       JLabel temp;
+
                        // now give all our shiny new components to the builder
                        builder.append(playPenRadio);
                        builder.append(playPenName, 7);
+                       associate(playPenName, playPenRadio);
                        builder.nextLine();

                        builder.append(""); // takes up blank space 
//$NON-NLS-1$
                        builder.append(physicalRadio);
- builder.append(Messages.getString("CompareDMPanel.physicalDatabaseLabel")); //$NON-NLS-1$
-                       // builder.nextColumn(2);
+ temp = builder.append(Messages.getString("CompareDMPanel.physicalDatabaseLabel")); //$NON-NLS-1$
+                       associate(temp, physicalRadio);
builder.append(catalogLabel = new JLabel(Messages.getString("CompareDMPanel.catalogLabel"))); //$NON-NLS-1$ builder.append(schemaLabel = new JLabel(Messages.getString("CompareDMPanel.schemaLabel"))); //$NON-NLS-1$
                        builder.appendRow(builder.getLineGapSpec());
                        builder.appendRow("pref"); //$NON-NLS-1$
                        builder.nextLine(2);
+
                        builder.nextColumn(4);
                        builder.append(databaseDropdown);
                        builder.append(catalogDropdown, schemaDropdown, 
newConnButton);
@@ -785,8 +795,10 @@

                        builder.append(""); //$NON-NLS-1$
                        builder.append(loadRadio);
- builder.append(Messages.getString("CompareDMPanel.fromFileLabel")); //$NON-NLS-1$ + temp = builder.append(Messages.getString("CompareDMPanel.fromFileLabel")); //$NON-NLS-1$
+                       associate(temp, loadRadio);
                        builder.nextLine();
+
                        builder.append(""); // takes up blank space 
//$NON-NLS-1$
                        builder.add(loadFilePath, cc.xyw(5, builder.getRow(), 
5));
                        builder.nextColumn(8);
@@ -794,7 +806,6 @@
                        builder.nextLine();

                }
-

                public boolean isModelWithUUID() {
                        return playPenRadio.isSelected() || 
loadRadio.isSelected();
@@ -1091,6 +1102,8 @@
                
target.physicalRadio.addActionListener(radioButtonActionEnabler);
                target.loadRadio.addActionListener(radioButtonActionEnabler);

+               JLabel temp;
+
builder.appendSeparator(Messages.getString("CompareDMPanel.outpurFormatSeparator")); //$NON-NLS-1$
                builder.appendRow(builder.getLineGapSpec());
                builder.appendRow("pref"); //$NON-NLS-1$
@@ -1099,10 +1112,12 @@
                builder.append(sqlButton);

                JPanel ddlTypePanel = new JPanel(new BorderLayout(3, 3));
- ddlTypePanel.add(new JLabel(Messages.getString("CompareDMPanel.sqlFor")), BorderLayout.WEST); //$NON-NLS-1$ + ddlTypePanel.add(temp = new JLabel(Messages.getString("CompareDMPanel.sqlFor")), BorderLayout.WEST); //$NON-NLS-1$
+               associate(temp, sqlButton);
                ddlTypePanel.add(sqlTypeDropdown, BorderLayout.CENTER); // ddl 
generator
                                                                                
                                                // type list
- ddlTypePanel.add(new JLabel(Messages.getString("CompareDMPanel.makeOlderLookLikeNewer")), BorderLayout.EAST); //$NON-NLS-1$ + ddlTypePanel.add(temp = new JLabel(Messages.getString("CompareDMPanel.makeOlderLookLikeNewer")), BorderLayout.EAST); //$NON-NLS-1$
+        associate(temp, sqlButton);
                builder.append(ddlTypePanel, 3);

                builder.appendRow(builder.getLineGapSpec());
@@ -1110,21 +1125,24 @@
                builder.nextLine(2);
                builder.nextColumn(2);
                builder.append(liquibaseButton);
- builder.append(Messages.getString("CompareDMPanel.liqubaseScript")); //$NON-NLS-1$
-
+ temp = builder.append(Messages.getString("CompareDMPanel.liqubaseScript")); //$NON-NLS-1$
+               associate(temp, liquibaseButton);
+
                builder.appendRow(builder.getLineGapSpec());
                builder.appendRow("pref"); //$NON-NLS-1$
                builder.nextLine(2);
                builder.nextColumn(2);
                builder.append(englishButton);
- builder.append(Messages.getString("CompareDMPanel.englishDescriptions")); //$NON-NLS-1$
-
+ temp = builder.append(Messages.getString("CompareDMPanel.englishDescriptions")); //$NON-NLS-1$
+               associate(temp, englishButton);
+
         builder.appendRow(builder.getLineGapSpec());
         builder.appendRow("pref"); //$NON-NLS-1$
         builder.nextLine(2);
         builder.nextColumn(2);
                builder.append(showNoChanges);
- builder.append(Messages.getString("CompareDMPanel.suppressSimilarities")); //$NON-NLS-1$ + temp = builder.append(Messages.getString("CompareDMPanel.suppressSimilarities")); //$NON-NLS-1$
+        associate(temp, showNoChanges);
         builder.nextLine();

builder.appendSeparator(Messages.getString("CompareDMPanel.status")); //$NON-NLS-1$
@@ -1595,4 +1613,43 @@

         }
        }
-}
+
+    /**
+     * Associates the given label with the given button, so that mouse
+     * events on the label behave as if they were clicks on the button. We
+     * need this because of the funny way the radio buttons and checkboxes
+     * on this panel are laid out.
+     *
+     * @param l
+     *            The label that should be clickable like the button.
+     * @param b
+     *            The button that should receive the label's clicks.
+     */
+    private void associate(final JLabel l, final AbstractButton b) {
+        l.addMouseListener(new MouseListener() {
+            private void retarget(MouseEvent e) {
+                Point p = b.getLocation();
+ SwingUtilities.convertPointToScreen(p, (Component) e.getSource());
+                MouseEvent newEvent = new MouseEvent(
+                        b,
+                        e.getID(),
+                        e.getWhen(),
+                        e.getModifiers(),
+                        0,
+                        0,
+                        p.x,
+                        p.y,
+                        e.getClickCount(),
+                        e.isPopupTrigger(),
+                        e.getButton());
+                b.dispatchEvent(newEvent);
+            }
+            public void mouseReleased(MouseEvent e) { retarget(e); }
+            public void mousePressed(MouseEvent e)  { retarget(e); }
+            public void mouseExited(MouseEvent e)   { retarget(e); }
+            public void mouseEntered(MouseEvent e)  { retarget(e); }
+            public void mouseClicked(MouseEvent e)  { retarget(e); }
+        });
+    }
+
+}

Reply via email to