From 4522d9aeb5c02c67a3a1a27898e874e635006772 Mon Sep 17 00:00:00 2001 From: bancika Date: Fri, 17 Aug 2012 12:56:35 +0000 Subject: [PATCH] Faster component placement, auto-focus on "Value" box --- .../diylc-swing/library/main.jar | Bin 195036 -> 195036 bytes .../diylc/swing/gui/editor/MeasureEditor.java | 17 +++++++++ .../gui/editor/PropertyEditorDialog.java | 35 ++++++++++++++---- .../swing/plugins/canvas/CanvasPanel.java | 20 +++++----- .../diylc-swing/update.xml | 4 ++ 5 files changed, 59 insertions(+), 17 deletions(-) diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar index a80925630e3a8553d70dac6a355d35ca4795553d..fbcc631c08a440f622edf68b04e7bd9221536fcf 100644 GIT binary patch delta 5017 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 PSfY#jfLuNF0NnZ?+sD=s delta 5017 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 diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/editor/MeasureEditor.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/editor/MeasureEditor.java index 63481836..ab9b1201 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/editor/MeasureEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/editor/MeasureEditor.java @@ -5,6 +5,7 @@ import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.KeyListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.reflect.InvocationTargetException; @@ -93,4 +94,20 @@ public class MeasureEditor extends Container { e.printStackTrace(); } } + + @Override + public void requestFocus() { + this.valueField.requestFocus(); + } + + @Override + public boolean requestFocusInWindow() { + return this.valueField.requestFocusInWindow(); + } + + @Override + public synchronized void addKeyListener(KeyListener l) { + this.valueField.addKeyListener(l); + this.unitBox.addKeyListener(l); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/editor/PropertyEditorDialog.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/editor/PropertyEditorDialog.java index 8f3bcc10..6717280a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/editor/PropertyEditorDialog.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/gui/editor/PropertyEditorDialog.java @@ -28,7 +28,8 @@ import org.diylc.swingframework.ButtonDialog; public class PropertyEditorDialog extends ButtonDialog { - private static final Logger LOG = Logger.getLogger(PropertyEditorDialog.class); + private static final Logger LOG = Logger + .getLogger(PropertyEditorDialog.class); private static final long serialVersionUID = 1L; @@ -36,9 +37,12 @@ public class PropertyEditorDialog extends ButtonDialog { private List properties; private Set defaultedProperties; + private Component componentToFocus = null; - public PropertyEditorDialog(JFrame owner, List properties, String title) { - super(owner, title, new String[] { ButtonDialog.OK, ButtonDialog.CANCEL }); + public PropertyEditorDialog(JFrame owner, List properties, + String title) { + super(owner, title, + new String[] { ButtonDialog.OK, ButtonDialog.CANCEL }); LOG.debug("Creating property editor for: " + properties); @@ -73,8 +77,9 @@ public class PropertyEditorDialog extends ButtonDialog { try { property.getValidator().validate(property.getValue()); } catch (ValidationException ve) { - JOptionPane.showMessageDialog(PropertyEditorDialog.this, "Input error for \"" - + property.getName() + "\": " + ve.getMessage(), "Error", + JOptionPane.showMessageDialog(PropertyEditorDialog.this, + "Input error for \"" + property.getName() + "\": " + + ve.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); return false; } @@ -126,6 +131,11 @@ public class PropertyEditorDialog extends ButtonDialog { editorPanel.add(createDefaultCheckBox(property), gbc); } + // Make value field focused + if (property.getName().equalsIgnoreCase("value")) { + componentToFocus = editor; + } + gbc.gridy++; } @@ -153,8 +163,10 @@ public class PropertyEditorDialog extends ButtonDialog { return defaultedProperties; } - public static boolean showFor(JFrame owner, List properties, String title) { - PropertyEditorDialog editor = new PropertyEditorDialog(owner, properties, title); + public static boolean showFor(JFrame owner, + List properties, String title) { + PropertyEditorDialog editor = new PropertyEditorDialog(owner, + properties, title); editor.setVisible(true); if (OK.equals(editor.getSelectedButtonCaption())) { return true; @@ -162,6 +174,15 @@ public class PropertyEditorDialog extends ButtonDialog { return false; } + @Override + public void setVisible(boolean b) { + if (b && componentToFocus != null) { + componentToFocus.requestFocusInWindow(); + componentToFocus = null; + } + super.setVisible(b); + } + @Override protected JComponent getMainComponent() { return createEditorFields(); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java index d606d947..3c05da35 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java @@ -182,16 +182,16 @@ class CanvasPanel extends JComponent implements Autoscroll { .isAltDown()); } }); - addMouseListener(new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getButton() == MouseEvent.BUTTON1) { - plugInPort.mouseClicked(e.getPoint(), e.getButton(), e.isControlDown(), e.isShiftDown(), e - .isAltDown(), e.getClickCount()); - } - } - }); +// addMouseListener(new MouseAdapter() { +// +// @Override +// public void mouseClicked(MouseEvent e) { +// if (e.getButton() == MouseEvent.BUTTON1) { +// plugInPort.mouseClicked(e.getPoint(), e.getButton(), e.isControlDown(), e.isShiftDown(), e +// .isAltDown(), e.getClickCount()); +// } +// } +// }); } // Autoscroll diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml index 427a3b62..15b0a2ba 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml @@ -658,6 +658,10 @@ IMPROVEMENT Control number of "Recently Used" items from config.properties + + IMPROVEMENT + Faster component placement, auto-focus on "Value" box + http://code.google.com/p/diy-layout-creator/downloads/list