r2057 - trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor
Author: tchemit Date: 2010-09-04 22:13:26 +0200 (Sat, 04 Sep 2010) New Revision: 2057 Url: http://nuiton.org/repositories/revision/jaxx/2057 Log: Anomalie #847: Can not use auto popup if showPopup is false Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor.jaxx trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor.jaxx =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor.jaxx 2010-09-04 20:12:30 UTC (rev 2056) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor.jaxx 2010-09-04 20:13:26 UTC (rev 2057) @@ -25,91 +25,104 @@ <JPanel layout='{new BorderLayout()}' - onFocusGained='textField.requestFocus()' - onFocusLost='setPopupVisible(false);popup.setVisible(false);' - onMouseExited='setPopupVisible(false);popup.setVisible(false);'> + onFocusGained='textField.requestFocus()' + onFocusLost='setPopupVisible(false);popup.setVisible(false);' + onMouseExited='setPopupVisible(false);popup.setVisible(false);'> - <!-- onFocusGained='if (autoPopup) setPopupVisible(true); textField.requestFocus();'--> + <!-- onFocusGained='if (autoPopup) setPopupVisible(true); textField.requestFocus();'--> - <!-- bean property associated with the editing value --> - <String id='property' javaBean='""'/> + <!-- bean property associated with the editing value --> + <String id='property' javaBean='""'/> - <!-- bean property --> - <Object id='bean' javaBean='null'/> + <!-- bean property --> + <Object id='bean' javaBean='null'/> - <!-- editor model --> - <Number id="model" javaBean='null'/> + <!-- editor model --> + <Number id="model" javaBean='null'/> - <!-- editor model type (specify it when you want to use a special type other than Integer or Float)--> - <Class id="modelType" javaBean='null'/> + <!-- editor model type (specify it when you want to use a special type other than Integer or Float)--> + <Class id="modelType" javaBean='null'/> - <!-- useFloat property --> - <Boolean id='useFloat' javaBean='false'/> - - <!-- useSign property --> - <Boolean id='useSign' javaBean='false'/> + <!-- useFloat property --> + <Boolean id='useFloat' javaBean='false'/> - <!-- autoPopup property --> - <Boolean id='autoPopup' javaBean='false'/> + <!-- useSign property --> + <Boolean id='useSign' javaBean='false'/> - <!-- showPopupButton property --> - <Boolean id='showPopupButton' javaBean='false'/> + <!-- autoPopup property --> + <Boolean id='autoPopup' javaBean='false'/> - <!-- show reset property --> - <Boolean id='showReset' javaBean='false'/> + <!-- showPopupButton property --> + <Boolean id='showPopupButton' javaBean='false'/> - <!-- internal editor model as text --> - <String id="modelText" javaBean='""'/> + <!-- show reset property --> + <Boolean id='showReset' javaBean='false'/> - <!-- internal state --> - <Boolean id='popupVisible' javaBean='false'/> + <!-- internal editor model as text --> + <String id="modelText" javaBean='""'/> - <!-- ui handler --> - <NumberEditorHandler id='handler' constructorParams='this'/> - - <!-- popup digital number editor --> - <JPopupMenu id='popup' - onPopupMenuWillBecomeVisible='button.setSelected(true)' - onPopupMenuWillBecomeInvisible='button.setSelected(false)' - onPopupMenuCanceled='button.setSelected(false)'> - <style source='NumberEditorPopup.css'/> - <JPanel layout='{new GridLayout(4,4)}' - border='{BorderFactory.createEmptyBorder(4, 4, 4, 4)}' - background='{Color.WHITE}'> - <JButton text='numbereditor.7' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton text='numbereditor.8' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton text='numbereditor.9' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton text='numbereditor.clearAll' onActionPerformed='setModel(null)' styleClass='clear' - enabled='{!getModelText().isEmpty()}'/> + <!-- internal state --> + <Boolean id='popupVisible' javaBean='false'/> + <!-- ui handler --> + <NumberEditorHandler id='handler' constructorParams='this'/> - <JButton text='numbereditor.4' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton text='numbereditor.5' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton text='numbereditor.6' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton text='numbereditor.clearOne' onActionPerformed='getHandler().removeChar()' styleClass='clear' - enabled='{!(getModelText().isEmpty() || textField.getCaretPosition() ==0 )}'/> + <!-- popup digital number editor --> + <JPopupMenu id='popup' + onPopupMenuWillBecomeVisible='showPopUpButton.setSelected(true)' + onPopupMenuWillBecomeInvisible='showPopUpButton.setSelected(false)' + onPopupMenuCanceled='showPopUpButton.setSelected(false)'> + <style source='NumberEditorPopup.css'/> + <JPanel layout='{new GridLayout(4,4)}' + border='{BorderFactory.createEmptyBorder(4, 4, 4, 4)}' + background='{Color.WHITE}'> + <JButton text='numbereditor.7' onActionPerformed='addChar(event)' + styleClass='digit'/> + <JButton text='numbereditor.8' onActionPerformed='addChar(event)' + styleClass='digit'/> + <JButton text='numbereditor.9' onActionPerformed='addChar(event)' + styleClass='digit'/> + <JButton text='numbereditor.clearAll' onActionPerformed='setModel(null)' + styleClass='clear' enabled='{!getModelText().isEmpty()}'/> - <JButton text='numbereditor.1' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton text='numbereditor.2' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton text='numbereditor.3' onActionPerformed='addChar(event)' styleClass='digit'/> - <JButton enabled="false"/> + <JButton text='numbereditor.4' onActionPerformed='addChar(event)' + styleClass='digit'/> + <JButton text='numbereditor.5' onActionPerformed='addChar(event)' + styleClass='digit'/> + <JButton text='numbereditor.6' onActionPerformed='addChar(event)' + styleClass='digit'/> + <JButton text='numbereditor.clearOne' + onActionPerformed='getHandler().removeChar()' styleClass='clear' + enabled='{!(getModelText().isEmpty() || textField.getCaretPosition() ==0 )}'/> - <JButton text='numbereditor.0' onActionPerformed='addChar(event)' styleClass='digit' - enabled='{!getEditor().getModelText().equals("0")}'/> + <JButton text='numbereditor.1' onActionPerformed='addChar(event)' + styleClass='digit'/> + <JButton text='numbereditor.2' onActionPerformed='addChar(event)' + styleClass='digit'/> + <JButton text='numbereditor.3' onActionPerformed='addChar(event)' + styleClass='digit'/> - <JButton id='toggleSign' text='numbereditor.toggleSign' styleClass='operator' - onActionPerformed='getHandler().toggleSign()' - enabled='{isUseSign() && !getEditor().getModelText().isEmpty()}'/> + <JButton enabled="false"/> - <JButton id='dot' text='numbereditor..' styleClass='operator' - onActionPerformed='addChar(event)' - enabled='{isUseFloat() && getEditor().getModelText().indexOf(".") == -1 }'/> + <JButton text='numbereditor.0' onActionPerformed='addChar(event)' + styleClass='digit' + enabled='{!getEditor().getModelText().equals("0")}'/> - <JButton actionIcon='numbereditor-validate' onActionPerformed="getHandler().validate()"/> - </JPanel> - </JPopupMenu> - <script><![CDATA[ + <JButton id='toggleSign' text='numbereditor.toggleSign' + styleClass='operator' + onActionPerformed='getHandler().toggleSign()' + enabled='{isUseSign() && !getEditor().getModelText().isEmpty()}'/> + + <JButton id='dot' text='numbereditor..' styleClass='operator' + onActionPerformed='addChar(event)' + enabled='{isUseFloat() && getEditor().getModelText().indexOf(".") == -1 }'/> + + <JButton actionIcon='numbereditor-validate' + onActionPerformed="getHandler().validate()"/> + </JPanel> + </JPopupMenu> + <script><![CDATA[ public void init() { handler.init(); } @@ -133,41 +146,42 @@ } ]]> - </script> + </script> - <JToolBar floatable='false' - borderPainted='false' - visible='{isShowReset()}' - constraints='BorderLayout.WEST'> - <JButton id='resetButton' - actionIcon='numbereditor-reset' - toolTipText='numbereditor.action.reset.tip' - focusable='false' - focusPainted='false' - enabled='{isEnabled()}' - onActionPerformed='setModel(null)'/> - </JToolBar> - - <JTextField id='textField' - constraints='BorderLayout.CENTER' - text='{getModelText()}' - enabled='{isEnabled()}' - onKeyReleased='getHandler().setModel(textField.getText())' - onFocusGained='showPopup()'/> + <JToolBar id='toolbar' + floatable='false' + borderPainted='false' + visible='{isShowReset()}' + constraints='BorderLayout.WEST'> + <JButton id='resetButton' + actionIcon='numbereditor-reset' + toolTipText='numbereditor.action.reset.tip' + focusable='false' + focusPainted='false' + enabled='{isEnabled()}' + onActionPerformed='setModel(null)'/> + </JToolBar> - <JToolBar constraints='BorderLayout.EAST' - floatable='false' - opaque='false' - borderPainted='false' - visible='{isShowPopupButton()}' - maximumSize='{new Dimension(24,24)}'> - <JToggleButton id='button' - focusable='false' - focusPainted='false' - actionIcon='numbereditor-calculator' - toolTipText='numbereditor.action.show.tip' - enabled='{isEnabled()}' - onActionPerformed='getHandler().setPopupVisible(!popup.isVisible())'/> - </JToolBar> + <JTextField id='textField' + constraints='BorderLayout.CENTER' + text='{getModelText()}' + enabled='{isEnabled()}' + onKeyReleased='getHandler().setModel(textField.getText())' + onFocusGained='showPopup()'/> + <JToolBar constraints='BorderLayout.EAST' + floatable='false' + opaque='false' + borderPainted='false' + visible='{isShowPopupButton()}' + maximumSize='{new Dimension(24,24)}'> + <JToggleButton id='showPopUpButton' + focusable='false' + focusPainted='false' + actionIcon='numbereditor-calculator' + toolTipText='numbereditor.action.show.tip' + enabled='{isEnabled()}' + onActionPerformed='getHandler().setPopupVisible(!popup.isVisible())'/> + </JToolBar> + </JPanel> Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java 2010-09-04 20:12:30 UTC (rev 2056) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java 2010-09-04 20:13:26 UTC (rev 2057) @@ -25,16 +25,17 @@ package jaxx.runtime.swing.editor; -import static jaxx.runtime.swing.editor.NumberEditor.PROPERTY_MODEL; -import static jaxx.runtime.swing.editor.NumberEditor.PROPERTY_POPUP_VISIBLE; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.swing.*; +import javax.swing.JComponent; +import javax.swing.JTextField; +import javax.swing.JToggleButton; +import javax.swing.SwingUtilities; import javax.swing.text.BadLocationException; -import java.awt.*; +import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; @@ -45,6 +46,9 @@ import java.math.BigDecimal; import java.math.BigInteger; +import static jaxx.runtime.swing.editor.NumberEditor.PROPERTY_MODEL; +import static jaxx.runtime.swing.editor.NumberEditor.PROPERTY_POPUP_VISIBLE; + /** * Le handler de l'éditeur graphique de nombres. * <p/> @@ -54,42 +58,62 @@ * @see NumberEditor */ public class NumberEditorHandler { - /** - * Logger - */ + /** Logger */ public static final Log log = LogFactory.getLog(NumberEditorHandler.class); + public static final String VALIDATE_PROPERTY = "validate"; - /** - * editor ui - */ + + /** editor ui */ protected NumberEditor editor; - /** - * the mutator method on the property of boxed bean in the editor - */ + + /** the mutator method on the property of boxed bean in the editor */ protected Method mutator; - /** - * the getter method on the property - */ + + /** the getter method on the property */ protected Method getter; - /** - * a flag to known if mutator accept null value - */ + + /** a flag to known if mutator accept null value */ protected Boolean acceptNull; protected Class<?> modelType; public NumberEditorHandler(NumberEditor ui) { - this.editor = ui; + editor = ui; } - /** - * initialise l'ui et les listeners d'évènements. - */ + /** initialise l'ui et les listeners d'évènements. */ public void init() { try { if (editor.getBean() == null) { throw new NullPointerException("can not have a null bean in ui " + editor); } + + editor.addPropertyChangeListener(NumberEditor.PROPERTY_SHOW_POPUP_BUTTON, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (log.isDebugEnabled()) { + log.debug("set showPopupButton" + evt.getNewValue() + " for " + editor.getProperty()); + } + if (editor.getPopup().isVisible()) { + setPopupVisible(false); + } + } + }); + + editor.addPropertyChangeListener(NumberEditor.PROPERTY_AUTO_POPUP, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (log.isDebugEnabled()) { + log.debug("set auto popup " + evt.getNewValue() + " for " + editor.getProperty()); + } + if (editor.getPopup().isVisible()) { + setPopupVisible(false); + } + } + }); + editor.addPropertyChangeListener(PROPERTY_MODEL, new PropertyChangeListener() { @Override @@ -161,9 +185,14 @@ @Override public void run() { - JToggleButton invoker = editor.getButton(); + JComponent invoker = + editor.isShowPopupButton() ? + editor.getShowPopUpButton() : + editor; Dimension dim = editor.getPopup().getPreferredSize(); - editor.getPopup().show(invoker, (int) (invoker.getPreferredSize().getWidth() - dim.getWidth()), invoker.getHeight()); + int x = (int) (invoker.getPreferredSize().getWidth() - dim.getWidth()); + editor.getPopup().show(invoker, + x, invoker.getHeight()); editor.getTextField().requestFocus(); } }); @@ -373,9 +402,7 @@ } } - /** - * @return l'éditeur au quel est rattaché le handler. - */ + /** @return l'éditeur au quel est rattaché le handler. */ public NumberEditor getEditor() { return editor; }
participants (1)
-
tchemit@users.nuiton.org