branch feature/3074 created (now bfda7bc)
This is an automated email from the git hooks/post-receive script. New change to branch feature/3074 in repository jaxx. See http://git.nuiton.org/jaxx.git at bfda7bc Ne pas formatter les petits nombres decimaux en notation scientifique This branch includes the following new commits: new 2c44ad5 remove NumberEditor2 (will use ng jaxx package for it (org.nuiton.jaxx...) new 029f7c6 introduce NumberEditor2 new 522e7a5 deprecates NumberCellEditor and replace it with new one at org.nuiton.jaxx.widgets.editor.cell package new 3f5d85c add demo for NumberEditor2 new bfda7bc Ne pas formatter les petits nombres decimaux en notation scientifique The 5 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit bfda7bce2deefb1f1f0e6dac274c3c1173b39475 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 19:09:22 2014 +0100 Ne pas formatter les petits nombres decimaux en notation scientifique commit 3f5d85c7b88dab2fb280d6245f6d2a9c6b0c71ba Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 18:50:27 2014 +0100 add demo for NumberEditor2 commit 522e7a5547358195aa5868b81394c6ab8e4aa80d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 18:50:01 2014 +0100 deprecates NumberCellEditor and replace it with new one at org.nuiton.jaxx.widgets.editor.cell package commit 029f7c60a402915f44ca91eca21da8094abb8af8 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 18:48:57 2014 +0100 introduce NumberEditor2 commit 2c44ad5df205011aa50ac407229c9c669eea833d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 18:47:25 2014 +0100 remove NumberEditor2 (will use ng jaxx package for it (org.nuiton.jaxx...) -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/3074 in repository jaxx. See http://git.nuiton.org/jaxx.git commit 2c44ad5df205011aa50ac407229c9c669eea833d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 18:47:25 2014 +0100 remove NumberEditor2 (will use ng jaxx package for it (org.nuiton.jaxx...) --- .../jaxx/runtime/swing/editor/NumberEditor2.css | 149 ---------- .../jaxx/runtime/swing/editor/NumberEditor2.jaxx | 94 ------ .../runtime/swing/editor/NumberEditor2Handler.java | 321 --------------------- .../runtime/swing/editor/NumberEditor2Model.java | 196 ------------- 4 files changed, 760 deletions(-) diff --git a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2.css b/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2.css deleted file mode 100644 index 3faef1d..0000000 --- a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2.css +++ /dev/null @@ -1,149 +0,0 @@ -/* - * #%L - * JAXX :: Widgets - * %% - * Copyright (C) 2008 - 2014 Code Lutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ -JToolBar { - floatable: false; - borderPainted: false; - opaque: false; -} - -#toolbarLeft { - visible: {model.isShowReset()}; -} - -#resetButton { - actionIcon: "numbereditor-reset"; - toolTipText: "numbereditor.action.reset.tip"; - toolTipText: {model.getShowResetTip()}; - focusable: false; - focusPainted: false; - enabled: {isEnabled()}; -} - -#editor { - enabled:{isEnabled()}; -} - -#toolbarRight { - maximumSize: {new Dimension(24,24)}; -} - -#showPopUpButton { - actionIcon: "numbereditor-calculator"; - toolTipText: "numbereditor.action.show.tip"; - enabled: {isEnabled()}; - visible: {model.isShowPopup()}; -} - -JButton { - font-size: 14; - focusPainted: false; - focusable: false; -} - -JButton.digit { - foreground: blue; -} - -JButton.operator { - foreground: #009900; -} - -JButton.clear { - foreground: red; -} - -JButton:mouseover { - font-weight: bold; -} - -JButton.operator:mouseover { - font-weight: normal; -} - -#popupPanel { - border: {BorderFactory.createEmptyBorder(4, 4, 4, 4)}; - background: {Color.WHITE}; -} - -#padTouch0 { - text: "numbereditor.0"; - /*enabled: {!getEditor().getModelText().equals("0")};*/ -} - -#padTouch1 { - text: "numbereditor.1"; -} - -#padTouch2 { - text: "numbereditor.2"; -} - -#padTouch3 { - text: "numbereditor.3"; -} - -#padTouch4 { - text: "numbereditor.4"; -} - -#padTouch5 { - text: "numbereditor.5"; -} - -#padTouch6 { - text: "numbereditor.6"; -} - -#padTouch7 { - text: "numbereditor.7"; -} - -#padTouch8 { - text: "numbereditor.8"; -} - -#padTouch9 { - text: "numbereditor.9"; -} - -#padTouchDot { - text: "numbereditor.dot"; -} - -#padTouchSign { - text: "numbereditor.sign"; - enabled: {model.isUseSign()}; -} - -#padTouchClearOne { - text: "numbereditor.cleanOne"; - /*enabled: {!(getModelText().isEmpty() || textField.getCaretPosition() ==0 )};*/ -} - -#padTouchClearAll { - text: "numbereditor.cleanAll"; - /*enabled: {!getModelText().isEmpty()}:*/ -} - -#padValidate { - actionIcon: "numbereditor-validate"; -} diff --git a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2.jaxx b/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2.jaxx deleted file mode 100644 index 6652a9a..0000000 --- a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2.jaxx +++ /dev/null @@ -1,94 +0,0 @@ -<!-- - #%L - JAXX :: Widgets - %% - Copyright (C) 2008 - 2014 Code Lutin, Tony Chemit - %% - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Lesser Public License for more details. - - You should have received a copy of the GNU General Lesser Public - License along with this program. If not, see - <http://www.gnu.org/licenses/lgpl-3.0.html>. - #L% - --> -<JPanel id='editorPanel' layout='{new BorderLayout()}' - onFocusGained='editor.requestFocus()' - onFocusLost='handler.setPopupVisible(false);popup.setVisible(false);' - onMouseExited='handler.setPopupVisible(false);popup.setVisible(false);'> - <import> - java.io.Serializable - java.awt.BorderLayout - java.awt.Color - java.awt.BorderLayout - java.awt.GridLayout - java.awt.Dimension - - javax.swing.JFormattedTextField - javax.swing.BorderFactory - </import> - - <!-- show reset property --> - <Boolean id='showReset' javaBean='false'/> - - <!-- show reset tip --> - <String id='showResetTip' javaBean=''/> - - <!-- model --> - <NumberEditor2Model id='model'/> - - <script><![CDATA[ -public void init() { handler.init(); } -public void setBean(Serializable bean) { model.setBean(bean); } -public void setBeanProperty(String beanProperty) { model.setBeanProperty(beanProperty); } -public void setValue(Number value) { handler.setValue(value, true); } -]]> - </script> - - <!-- popup digital number editor --> - <JPopupMenu id='popup' - onPopupMenuWillBecomeVisible='showPopUpButton.setSelected(true)' - onPopupMenuWillBecomeInvisible='showPopUpButton.setSelected(false)' - onPopupMenuCanceled='showPopUpButton.setSelected(false)'> - <JPanel id='popupPanel' layout='{new GridLayout(4,4)}'> - - <JButton id='padTouch7' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouch8' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouch9' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouchClearAll' styleClass='clear' onActionPerformed='handler.setModel(null)'/> - - <JButton id='padTouch4' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouch5' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouch6' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouchClearOne' styleClass='clear' onActionPerformed='handler.removeChar()' /> - - <JButton id='padTouch1' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouch2' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouch3' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton enabled="false"/> - - <JButton id='padTouch0' styleClass='digit' onActionPerformed='handler.addChar(event)'/> - <JButton id='padTouchSign' styleClass='operator' onActionPerformed='handler.toggleSign()'/> - <JButton id='padTouchDot' styleClass='operator' onActionPerformed='handler.addChar(event)'/> - <JButton id='padValidate' onActionPerformed="handler.validate()"/> - </JPanel> - </JPopupMenu> - - <JToolBar id='toolbarLeft' constraints='BorderLayout.WEST'> - <JButton id='resetButton' onActionPerformed='handler.resetEditor()'/> - </JToolBar> - <JFormattedTextField id='editor' constraints='BorderLayout.CENTER' - onKeyReleased='handler.onKeyReleased(event)'/> - - <JToolBar id='toolbarRight' constraints='BorderLayout.EAST'> - <JToggleButton id='showPopUpButton' - onActionPerformed='handler.setPopupVisible(!popup.isVisible())'/> - </JToolBar> -</JPanel> diff --git a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2Handler.java b/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2Handler.java deleted file mode 100644 index 4e6c07b..0000000 --- a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2Handler.java +++ /dev/null @@ -1,321 +0,0 @@ -package jaxx.runtime.swing.editor; - -/* - * #%L - * JAXX :: Widgets - * %% - * Copyright (C) 2008 - 2014 Code Lutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ - -import com.google.common.base.Preconditions; -import jaxx.runtime.spi.UIHandler; -import jaxx.runtime.swing.editor.gis.DmdCoordinate; -import jaxx.runtime.swing.editor.gis.DmdCoordinateConverter; -import jaxx.runtime.swing.editor.gis.MaskFormatterFromConverter; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.util.beans.BeanUtil; - -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JFormattedTextField; -import javax.swing.SwingUtilities; -import javax.swing.text.BadLocationException; -import javax.swing.text.DefaultFormatterFactory; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.lang.reflect.Method; -import java.text.ParseException; - -/** - * Created on 2/11/14. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 2.8.1 - */ -public class NumberEditor2Handler implements UIHandler<NumberEditor2> { - - /** Logger. */ - private static final Log log = LogFactory.getLog(NumberEditor2Handler.class); - - protected NumberEditor2 ui; - - protected JFormattedTextField editor; - - protected DmdCoordinateConverter signedConverter; - - protected DmdCoordinateConverter unsignedConverter; - - protected DefaultFormatterFactory signedFormatterFactory; - - protected DefaultFormatterFactory unsignedFormatterFactory; - - /** the mutator method on the property of boxed bean in the editor */ - protected Method mutator; - - /** the getter method on the property */ - protected Method getter; - - /** a flag to known if mutator accept null value */ - protected Boolean acceptNull; - - protected NumberEditor2Model model; - - protected String lastValidText; - - @Override - public void beforeInit(NumberEditor2 ui) { - this.ui = ui; - } - - @Override - public void afterInit(NumberEditor2 ui) { - this.model = ui.getModel(); - this.editor = ui.getEditor(); - - } - - public void init() { - - Preconditions.checkNotNull(model.getBean(), "could not find bean in " + model); - Preconditions.checkNotNull(model.getBeanProperty(), "could not find beanProperty in " + model); - Preconditions.checkNotNull(model.getNumberType(), "could not find numberType in " + model); - - Object bean = model.getBean(); - mutator = BeanUtil.getMutator(bean, model.getBeanProperty()); - Preconditions.checkNotNull(mutator, "could not find mutator for " + model.getBeanProperty()); - - { - // prepare unsigned formatter factory - String pattern = getMaskFormatterPattern(false); - MaskFormatterFromConverter<DmdCoordinate> maskFormatter; - try { - maskFormatter = MaskFormatterFromConverter.newFormatter( - DmdCoordinate.class, - pattern, unsignedConverter); - maskFormatter.setValidCharacters(" 01234567890."); - maskFormatter.setCommitsOnValidEdit(true); - unsignedFormatterFactory = new DefaultFormatterFactory(maskFormatter); - } catch (ParseException e) { - // can't happen here - throw new RuntimeException(e); - } - } - { - // prepare signed formatter factory - String pattern = getMaskFormatterPattern(true); - MaskFormatterFromConverter<DmdCoordinate> maskFormatter; - try { - maskFormatter = MaskFormatterFromConverter.newFormatter( - DmdCoordinate.class, - pattern, signedConverter); - maskFormatter.setValidCharacters(" 01234567890."); - maskFormatter.setCommitsOnValidEdit(true); - signedFormatterFactory = new DefaultFormatterFactory(maskFormatter); - } catch (ParseException e) { - // can't happen here - throw new RuntimeException(e); - } - } - -// JFormattedTextField editor = ui.getEditor(); -// editor.setFormatterFactory(model.isSign() ? -// signedFormatterFactory : -// unsignedFormatterFactory); -// editor.setFocusLostBehavior(JFormattedTextField.COMMIT); -// -// // When editor changes his value, propagate it to model -// editor.addPropertyChangeListener("value", new PropertyChangeListener() { -// @Override -// public void propertyChange(PropertyChangeEvent evt) { -// DmdCoordinate newValue = (DmdCoordinate) evt.getNewValue(); -// if (log.isDebugEnabled()) { -// log.debug("Value has changed: " + newValue); -// } -// model.setValue(newValue); -// } -// }); - } - - public void setModel(Object model) { - - } - - /** - * Ajoute le caractère donné à l'endroit où est le curseur dans la zone de - * saisie et met à jour le modèle. - * - * @param s le caractère à ajouter. - */ - void addChar(String s) { - char c = s.charAt(0); - try { - editor.getDocument().insertString(editor.getCaretPosition(), c + "", null); -// setModel(editor.getText()); - //setModel(editor.getModelText() + c); - - } catch (BadLocationException e) { - log.warn(e); - } - } - - /** - * Supprime le caractère juste avant le curseur du modèle (textuel) et - * met à jour la zone de saisie. - */ - public void removeChar() { -// String s = editor.getModelText(); -// int position = editor.getCaretPosition(); -// if (position < 1 || s.isEmpty()) { -// if (log.isDebugEnabled()) { -// log.debug("cannot remove when caret on first position or text empty"); -// } -// // on est au debut du doc, donc rien a faire -// return; -// } -// try { -// editor.getDocument().remove(position - 1, 1); -// } catch (BadLocationException ex) { -// // ne devrait jamais arrive vu qu'on a fait le controle... -// log.debug(ex); -// return; -// } -// String newText = editor.getText(); -// if (log.isDebugEnabled()) { -// log.debug("text updated : " + newText); -// } -// position--; -// editor.setCaretPosition(position); -// setModel(newText); - } - - /** - * Permute le signe dans la zone de saisie et - * dans le modèle. - */ - public void toggleSign() { -// // change sign -// String newValue = editor.getModelText(); -// -// if (newValue.startsWith("-")) { -// setModel(newValue.substring(1)); -// } else { -// setModel("-" + newValue); -// } - } - - void addChar(ActionEvent event) { - String text = ((JButton) event.getSource()).getText(); - addChar(text); - } - - /** - * Affiche ou cache la popup. - * - * @param newValue la nouvelle valeur de visibilité de la popup. - */ - public void setPopupVisible(Boolean newValue) { - - if (log.isTraceEnabled()) { - log.trace(newValue); - } - - if (newValue == null || !newValue) { - ui.getPopup().setVisible(false); - return; - } - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - JComponent invoker = - model.isShowPopup() ? - ui.getShowPopUpButton() : - ui; - Dimension dim = ui.getPopup().getPreferredSize(); - int x = (int) (invoker.getPreferredSize().getWidth() - dim.getWidth()); - ui.getPopup().show(invoker, x, invoker.getHeight()); - ui.getEditor().requestFocus(); - } - }); - } - - protected String getMaskFormatterPattern(boolean useSign) { - String pattern = "############"; - if (useSign) { - pattern = "-" + pattern; - } - return pattern; - } - - public void validate() { - //TODO - } - - public void resetEditor() { - //TODO - } - - public void onKeyReleased(KeyEvent event) { - //TODO - } - - public void setValue(Number value, boolean b) { - //TODO - } - - protected class PopupListener extends MouseAdapter { - - @Override - public void mousePressed(MouseEvent e) { - maybeShowPopup(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - maybeShowPopup(e); - } - - protected void maybeShowPopup(MouseEvent e) { - if (!e.isPopupTrigger()) { - return; - } - if (model.isAutoPopup()) { - if (model.isPopupVisible()) { - if (!ui.getPopup().isVisible()) { - setPopupVisible(true); - } - // popup already visible - - } else { - // set popup auto - model.setPopupVisible(true); - - } - } else { - if (model.isPopupVisible()) { - setPopupVisible(true); - } - } - } - - } -} diff --git a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2Model.java b/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2Model.java deleted file mode 100644 index 23724a8..0000000 --- a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor2Model.java +++ /dev/null @@ -1,196 +0,0 @@ -package jaxx.runtime.swing.editor; - -/* - * #%L - * JAXX :: Widgets - * %% - * Copyright (C) 2008 - 2014 Code Lutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ - -import org.jdesktop.beans.AbstractSerializableBean; - -import java.util.regex.Pattern; - -/** - * Created on 2/11/14. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 2.8.1 - */ -public class NumberEditor2Model extends AbstractSerializableBean { - - public static final String PROPERTY_BEAN = "bean"; - - public static final String PROPERTY_BEAN_PROPERTY = "beanProperty"; - - public static final String PROPERTY_NUMBER_TYPE = "numberType"; - - public static final String PROPERTY_NUMBER_PATTERN = "numberPattern"; - - public static final String PROPERTY_USE_SIGN = "useSign"; - - public static final String PROPERTY_SHOW_RESET = "showReset"; - - public static final String PROPERTY_SHOW_POPUP = "showPopup"; - - public static final String PROPERTY_AUTO_POPUP = "autoPopup"; - - public static final String PROPERTY_MODEL = "model"; - - public static final String PROPERTY_MODEL_TEXT = "modelText"; - - public static final String PROPERTY_POPUP_VISIBLE = "popupVisible"; - - public static final String PROPERTY_SELECT_ALL_TEXT_ON_ERROR = "selectAllTextOnError"; - - public static final String PROPERTY_SHOW_RESET_TIP = "showResetTip"; - - private static final long serialVersionUID = 1L; - - protected Object bean; - - protected String beanProperty; - - protected Class<? extends Number> numberType; - - protected Pattern numberPattern; - - protected boolean useSign; - - protected boolean showReset; - - protected boolean showPopup; - - protected boolean autoPopup; - - protected boolean selectAllTextOnError; - - protected boolean popupVisible; - - private String showResetTip; - - public Object getBean() { - return bean; - } - - public String getBeanProperty() { - return beanProperty; - } - - public Class<? extends Number> getNumberType() { - return numberType; - } - - public Pattern getNumberPattern() { - return numberPattern; - } - - public boolean isUseSign() { - return useSign; - } - - public boolean isShowReset() { - return showReset; - } - - public boolean isShowPopup() { - return showPopup; - } - - public boolean isAutoPopup() { - return autoPopup; - } - - public boolean isSelectAllTextOnError() { - return selectAllTextOnError; - } - - public boolean isPopupVisible() { - return popupVisible; - } - - public String getShowResetTip() { - return showResetTip; - } - - public void setBean(Object bean) { - Object oldValue = getBean(); - this.bean = bean; - firePropertyChange(PROPERTY_BEAN, oldValue, bean); - } - - public void setBeanProperty(String beanProperty) { - Object oldValue = getBeanProperty(); - this.beanProperty = beanProperty; - firePropertyChange(PROPERTY_BEAN_PROPERTY, oldValue, beanProperty); - } - - public void setNumberType(Class<? extends Number> numberType) { - Object oldValue = getNumberType(); - this.numberType = numberType; - firePropertyChange(PROPERTY_NUMBER_TYPE, oldValue, numberType); - } - - public void setNumberPattern(Pattern numberPattern) { - Object oldValue = getNumberPattern(); - this.numberPattern = numberPattern; - firePropertyChange(PROPERTY_NUMBER_PATTERN, oldValue, numberPattern); - } - - public void setUseSign(boolean useSign) { - Object oldValue = isUseSign(); - this.useSign = useSign; - firePropertyChange(PROPERTY_USE_SIGN, oldValue, useSign); - } - - public void setShowReset(boolean showReset) { - Object oldValue = isShowReset(); - this.showReset = showReset; - firePropertyChange(PROPERTY_SHOW_RESET, oldValue, showReset); - } - - public void setShowPopup(boolean showPopup) { - Object oldValue = isShowPopup(); - this.showPopup = showPopup; - firePropertyChange(PROPERTY_SHOW_POPUP, oldValue, showPopup); - } - - public void setAutoPopup(boolean autoPopup) { - Object oldValue = isAutoPopup(); - this.autoPopup = autoPopup; - firePropertyChange(PROPERTY_AUTO_POPUP, oldValue, autoPopup); - } - - public void setSelectAllTextOnError(boolean selectAllTextOnError) { - Object oldValue = isSelectAllTextOnError(); - this.selectAllTextOnError = selectAllTextOnError; - firePropertyChange(PROPERTY_SELECT_ALL_TEXT_ON_ERROR, oldValue, selectAllTextOnError); - } - - public void setPopupVisible(boolean popupVisible) { - Object oldValue = isPopupVisible(); - this.popupVisible = popupVisible; - firePropertyChange(PROPERTY_POPUP_VISIBLE, oldValue, popupVisible); - } - - public void setShowResetTip(String showResetTip) { - Object oldValue = getShowResetTip(); - this.showResetTip = showResetTip; - firePropertyChange(PROPERTY_SHOW_RESET_TIP, oldValue, showResetTip); - } -} -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/3074 in repository jaxx. See http://git.nuiton.org/jaxx.git commit 029f7c60a402915f44ca91eca21da8094abb8af8 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 18:48:57 2014 +0100 introduce NumberEditor2 --- .../java/org/nuiton/jaxx/widgets/ModelToBean.java | 13 + .../MutateOnConditionalPropertyChangeListener.java | 50 ++ .../jaxx/widgets/editor/number/NumberEditor2.css | 140 +++++ .../jaxx/widgets/editor/number/NumberEditor2.jaxx | 132 +++++ .../widgets/editor/number/NumberEditor2Config.java | 82 +++ .../editor/number/NumberEditor2Handler.java | 642 +++++++++++++++++++++ .../widgets/editor/number/NumberEditor2Model.java | 176 ++++++ 7 files changed, 1235 insertions(+) diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/ModelToBean.java b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/ModelToBean.java new file mode 100644 index 0000000..95f8af2 --- /dev/null +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/ModelToBean.java @@ -0,0 +1,13 @@ +package org.nuiton.jaxx.widgets; + +/** + * Created on 11/23/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.17 + */ +public interface ModelToBean { + + Object getBean(); + +} diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/MutateOnConditionalPropertyChangeListener.java b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/MutateOnConditionalPropertyChangeListener.java new file mode 100644 index 0000000..c5c4c1b --- /dev/null +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/MutateOnConditionalPropertyChangeListener.java @@ -0,0 +1,50 @@ +package org.nuiton.jaxx.widgets; + +import com.google.common.base.Predicate; +import jaxx.runtime.swing.JAXXRuntimeException; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.lang.reflect.Method; + +/** + * A property change listener to mutate to a bean after a predicate is applied. + * + * Created on 11/23/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.17 + */ +public class MutateOnConditionalPropertyChangeListener<M extends ModelToBean> implements PropertyChangeListener { + + private final M model; + + private final Method mutator; + + private final Predicate<M> canMutatePredicate; + + public MutateOnConditionalPropertyChangeListener(M model, Method mutator, Predicate<M> canMutatePredicate) { + this.model = model; + this.mutator = mutator; + this.canMutatePredicate = canMutatePredicate; + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + + if (canMutatePredicate.apply(model)) { + + Object newValue = evt.getNewValue(); + + try { + + mutator.invoke(model.getBean(), newValue); + + } catch (Exception e) { + throw new JAXXRuntimeException(e); + } + + } + + } +} diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.css b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.css new file mode 100644 index 0000000..8813c4d --- /dev/null +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.css @@ -0,0 +1,140 @@ + +.enabled { + enabled:{isEnabled()}; +} + +JButton.digit { + foreground: blue; + font-size: 14; + focusPainted: false; + focusable: false; +} + +JButton.operator { + foreground: #009900; + font-size: 14; + focusPainted: false; + focusable: false; +} + +JButton.clear { + foreground: red; + font-size: 14; + focusPainted: false; + focusable: false; +} + +JButton.digit:mouseover { + font-weight: bold; +} + +JButton.clear:mouseover { + font-weight: bold; +} + +JButton.operator:mouseover { + font-weight: normal; +} + +JToolBar { + floatable:false; + borderPainted:false; + opaque:false; +} + +#popupPanel { + border:{BorderFactory.createEmptyBorder(4, 4, 4, 4)}; + background:{Color.WHITE}; +} + +#leftToolbar { + visible:{isShowReset()}; +} + +#textField { + text:{model.getTextValue()}; +} + +#rightToolbar { + visible:{isShowPopupButton()}; + maximumSize:{new Dimension(24,24)}; +} + +#resetButton { + actionIcon:"numbereditor-reset"; + toolTipText:"numbereditor.action.reset.tip"; + focusable:false; + focusPainted:false; +} + +#showPopUpButton { + focusable:false; + focusPainted:false; + actionIcon:"numbereditor-calculator"; + toolTipText:"numbereditor.action.show.tip"; +} + +#toggleSignButton { + text:"numbereditor.toggleSign"; + enabled:{model.isCanUseSign()}; +} + +#dotButton { + text:"numbereditor.."; + enabled:{model.isCanUseDot()}; +} + +#clearAllButton { + text:"numbereditor.clearAll"; + enabled:{model.isCanClearAll()}; +} + +#clearOneButton { + text:"numbereditor.clearOne"; + enabled:{model.isCanClearAll() && textField.getCaretPosition() > 0}; +} + +#validateButton { + actionIcon:"numbereditor-validate"; +} + +#number0Button { + text:"numbereditor.0"; + enabled:{model.isCanUseZero()}; +} + +#number1Button { + text:"numbereditor.1"; +} + +#number2Button { + text:"numbereditor.2"; +} + +#number3Button { + text:"numbereditor.3"; +} + +#number4Button { + text:"numbereditor.4"; +} + +#number5Button { + text:"numbereditor.5"; +} + +#number6Button { + text:"numbereditor.6"; +} + +#number7Button { + text:"numbereditor.7"; +} + +#number8Button { + text:"numbereditor.8"; +} + +#number9Button { + text:"numbereditor.9"; +} diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.jaxx b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.jaxx new file mode 100644 index 0000000..852acc1 --- /dev/null +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.jaxx @@ -0,0 +1,132 @@ +<!-- + #%L + JAXX :: Widgets + %% + Copyright (C) 2008 - 2014 Code Lutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Lesser Public License for more details. + + You should have received a copy of the GNU General Lesser Public + License along with this program. If not, see + <http://www.gnu.org/licenses/lgpl-3.0.html>. + #L% + --> + +<JPanel layout='{new BorderLayout()}' + onFocusGained='textField.requestFocus()' + onFocusLost='setPopupVisible(false);popup.setVisible(false);' + onMouseExited='setPopupVisible(false);popup.setVisible(false);'> + + <import> + + java.io.Serializable + + java.awt.Color + java.awt.BorderLayout + java.awt.GridLayout + java.awt.Dimension + + javax.swing.BorderFactory + + </import> + + <NumberEditor2Model id="model" initializer="getContextValue(NumberEditor2Model.class)"/> + + <!-- autoPopup property --> + <Boolean id='autoPopup' javaBean='false'/> + + <!-- showPopupButton property --> + <Boolean id='showPopupButton' javaBean='false'/> + + <!-- show reset property --> + <Boolean id='showReset' javaBean='false'/> + + <!-- internal state --> + <Boolean id='popupVisible' javaBean='false'/> + + <script><![CDATA[ + +// Config delegate methods +public void setProperty(String property) { model.getConfig().setProperty(property); } +public void setUseSign(boolean useSign) { model.getConfig().setUseSign(useSign); } +public void setNumberType(Class<?> numberType) { model.getConfig().setNumberType(numberType); } +public void setSelectAllTextOnError(boolean selectAllTextOnError) { model.getConfig().setSelectAllTextOnError(selectAllTextOnError); } + +// Model delegate methods +public void setBean(Serializable bean) { model.setBean(bean); } +public void setNumberValue(Number numberValue) { model.setNumberValue(numberValue); } +public void setNumberPattern(String numberPattern) { model.setNumberPattern(numberPattern); } + +public void init() { handler.init(); } + +void showPopup() { + if ( popupVisible || autoPopup ) { + if (!popupVisible) { + setPopupVisible(true); + } else if (!getPopup().isVisible()) { + handler.setPopupVisible(true); + } + } +} + +@Override +public void setToolTipText(String toolTipText) { + super.setToolTipText(toolTipText); + textField.setToolTipText(toolTipText); +} + +]]> + </script> + + <!-- popup digital number editor --> + <JPopupMenu id='popup' + onPopupMenuWillBecomeVisible='showPopUpButton.setSelected(true)' + onPopupMenuWillBecomeInvisible='showPopUpButton.setSelected(false)' + onPopupMenuCanceled='showPopUpButton.setSelected(false)'> + <!--<style source='NumberEditorPopup.css'/>--> + <JPanel id='popupPanel' layout='{new GridLayout(4,4)}'> + + <JButton id='number7Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + <JButton id='number8Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + <JButton id='number9Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + <JButton id='clearAllButton' styleClass='clear' onActionPerformed='handler.reset()'/> + + <JButton id='number4Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + <JButton id='number5Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + <JButton id='number6Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + <JButton id='clearOnebutton' styleClass='clear' onActionPerformed="handler.removeChar()"/> + + <JButton id='number1Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + <JButton id='number2Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + <JButton id='number3Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> + + <JButton enabled="false"/> + + <JButton id='number0' styleClass='digit' onActionPerformed="handler.addChar('0')"/> + <JButton id='toggleSignButton' styleClass='operator' onActionPerformed='handler.toggleSign()'/> + <JButton id='dotButton' styleClass='operator' onActionPerformed="handler.addChar('.')"/> + <JButton id='validateButton' onActionPerformed="handler.validate()"/> + </JPanel> + </JPopupMenu> + + <JToolBar id='leftToolbar' constraints='BorderLayout.WEST' styleClass="enabled"> + <JButton id='resetButton' onActionPerformed='handler.reset()'/> + </JToolBar> + + <JTextField id='textField' constraints='BorderLayout.CENTER' styleClass="enabled" + onKeyReleased='handler.setTextValue(textField.getText())' + onFocusGained='showPopup()'/> + + <JToolBar id='rightToolbar' constraints='BorderLayout.EAST' styleClass="enabled"> + <JToggleButton id='showPopUpButton' onActionPerformed='handler.setPopupVisible(!popup.isVisible())'/> + </JToolBar> + +</JPanel> diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Config.java b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Config.java new file mode 100644 index 0000000..40ccfb7 --- /dev/null +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Config.java @@ -0,0 +1,82 @@ +package org.nuiton.jaxx.widgets.editor.number; + +import java.io.Serializable; + +/** + * Put here all immutable options used to init the number editor. + * + * Created on 11/23/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.17 + */ +public class NumberEditor2Config implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * Optional property where to bind the number value in optional bean. + */ + protected String property; + + /** + * Should you allowed signed number ? + */ + protected boolean useSign = true; + + /** + * Should you allowed decimal number ? + */ + protected Boolean useDecimal; + + /** + * Type of number. + */ + protected Class<?> numberType; + + /** + * When a error occurs, previous valid value is repush in textField, + * with this flag setted to true then also reselect this content. + */ + protected boolean selectAllTextOnError; + + public Class<?> getNumberType() { + return numberType; + } + + public void setNumberType(Class<?> numberType) { + this.numberType = numberType; + } + + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + + public boolean isSelectAllTextOnError() { + return selectAllTextOnError; + } + + public void setSelectAllTextOnError(boolean selectAllTextOnError) { + this.selectAllTextOnError = selectAllTextOnError; + } + + public boolean isUseSign() { + return useSign; + } + + public void setUseSign(boolean useSign) { + this.useSign = useSign; + } + + public Boolean getUseDecimal() { + return useDecimal; + } + + public void setUseDecimal(Boolean useDecimal) { + this.useDecimal = useDecimal; + } +} diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Handler.java b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Handler.java new file mode 100644 index 0000000..55e4e8e --- /dev/null +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Handler.java @@ -0,0 +1,642 @@ +package org.nuiton.jaxx.widgets.editor.number; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; +import jaxx.runtime.spi.UIHandler; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.widgets.MutateOnConditionalPropertyChangeListener; +import org.nuiton.util.beans.BeanUtil; + +import javax.swing.JComponent; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import javax.swing.text.BadLocationException; +import java.awt.Dimension; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +/** + * Created on 11/23/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.17 + */ +public class NumberEditor2Handler implements UIHandler<NumberEditor2> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(NumberEditor2Handler.class); + + protected final static ImmutableSet<Class<?>> INT_CLASSES = ImmutableSet.copyOf(Sets.<Class<?>>newHashSet( + byte.class, + Byte.class, + short.class, + Short.class, + int.class, + Integer.class, + BigInteger.class + )); + + private static final String VALIDATE_PROPERTY = "validate"; + + protected NumberEditor2 ui; + + protected Pattern numberPattern; + + protected NumberParserFormatter numberParserFormatter; + + private static Map<Class<?>, NumberParserFormatter<?>> numberFactories; + + @Override + public void beforeInit(NumberEditor2 ui) { + this.ui = ui; + + NumberEditor2Model model = new NumberEditor2Model(new NumberEditor2Config()); + ui.setContextValue(model); + } + + @Override + public void afterInit(NumberEditor2 ui) { + // nothing to do here, everything is done in init method + } + + /** + * Ajoute le caractère donné à l'endroit où est le curseur dans la zone de + * saisie et met à jour le modèle. + * + * @param c le caractère à ajouter. + */ + public void addChar(char c) { + try { + + ui.getTextField().getDocument().insertString(ui.getTextField().getCaretPosition(), c + "", null); + + } catch (BadLocationException e) { + log.warn(e); + } + + setTextValue(ui.getTextField().getText()); + + } + + /** + * Supprime le caractère juste avant le curseur du modèle (textuel) et + * met à jour la zone de saisie. + */ + public void removeChar() { + + JTextField textField = ui.getTextField(); + + int position = textField.getCaretPosition(); + if (position < 1) { + if (log.isDebugEnabled()) { + log.debug("cannot remove when caret on first position or text empty"); + } + // on est au debut du doc, donc rien a faire + return; + } + try { + textField.getDocument().remove(position - 1, 1); + } catch (BadLocationException ex) { + // ne devrait jamais arrive vu qu'on a fait le controle... + log.debug(ex); + return; + } + String newText = textField.getText(); + if (log.isDebugEnabled()) { + log.debug("text updated : " + newText); + } + position--; + textField.setCaretPosition(position); + + setTextValue(newText); + + } + + public void reset() { + +// ui.getModel().setNumberValue(null); + + setTextValue(""); + + } + + /** + * Permute le signe dans la zone de saisie et + * dans le modèle. + */ + public void toggleSign() { + + String newValue = ui.getModel().getTextValue(); + + if (newValue.startsWith("-")) { + newValue = newValue.substring(1); + } else { + newValue = "-" + newValue; + } + + setTextValue(newValue); + + } + + public void setTextValue(String newText) { + + NumberEditor2Model model = ui.getModel(); + + boolean textValid; + + if (StringUtils.isEmpty(newText)) { + + // empty text is always valid + textValid = true; + + } else { + + if (numberPattern != null) { + + // use given number pattern to check text + Matcher matcher = numberPattern.matcher(newText); + + textValid = matcher.matches(); + + } else { + + // check text validity "by hand" + //TODO + textValid = true; + + } + + } + + if (textValid) { + + if (log.isInfoEnabled()) { + log.info("Text [" + newText + "] is valid, will set it to model"); + } + + model.setTextValue(newText); + + } else { + + String oldText = model.getTextValue(); + + if (oldText == null) { + + oldText = ""; + + } + + if (log.isInfoEnabled()) { + log.info("Text [" + newText + "] is not valid, will rollback to previous valid text: " + oldText); + } + + ui.getTextField().setText(oldText); + + } + + } + + /** + * Affiche ou cache la popup. + * + * @param newValue la nouvelle valeur de visibilité de la popup. + */ + public void setPopupVisible(Boolean newValue) { + + if (log.isTraceEnabled()) { + log.trace(newValue); + } + + if (newValue == null || !newValue) { + ui.getPopup().setVisible(false); + return; + } + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + JComponent invoker = + ui.isShowPopupButton() ? + ui.getShowPopUpButton() : + ui; + Dimension dim = ui.getPopup().getPreferredSize(); + int x = (int) (invoker.getPreferredSize().getWidth() - dim.getWidth()); + ui.getPopup().show(invoker, x, invoker.getHeight()); + ui.getTextField().requestFocus(); + } + }); + } + + protected void init() { + + NumberEditor2Model model = ui.getModel(); + + NumberEditor2Config config = model.getConfig(); + + Class<?> numberType = config.getNumberType(); + + { + // init numberType + Preconditions.checkState(numberType != null, "Required a number type on " + ui); + + numberParserFormatter = getNumberFactory(numberType); + + if (log.isInfoEnabled()) { + log.info("init numberType: " + numberType + " on " + ui); + } + + } + + { + + // init canUseDecimal + Boolean useDecimal = config.getUseDecimal(); + + boolean canBeDecimal = !INT_CLASSES.contains(numberType); + + if (useDecimal == null) { + + // guess from type + useDecimal = canBeDecimal; + + config.setUseDecimal(useDecimal); + + } else { + + // Check this is possible + Preconditions.checkState(!useDecimal || canBeDecimal, "Can't use decimal with the following number type " + numberType + " on " + ui); + + } + + } + + { + + // init numberPattern + String numberPatternDef = model.getNumberPattern(); + if (StringUtils.isNotEmpty(numberPatternDef)) { + + setNumberPattern(numberPatternDef); + + } + } + + + { + + // list when number pattern changed to recompute it + model.addPropertyChangeListener(NumberEditor2Model.PROPERTY_NUMBER_PATTERN, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + String newPattern = (String) evt.getNewValue(); + + setNumberPattern(newPattern); + + if (log.isInfoEnabled()) { + log.info("set new numberPattern" + newPattern); + } + if (StringUtils.isEmpty(newPattern)) { + numberPattern = null; + } else { + numberPattern = Pattern.compile(newPattern); + } + } + }); + + // listen when numberValue changed (should be from outside) to convert to textValue + model.addPropertyChangeListener(NumberEditor2Model.PROPERTY_NUMBER_VALUE, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + Number newValue = (Number) evt.getNewValue(); + setTextValueFromNumberValue(newValue); + + + } + }); + + // listen when textValue changed to convert to number value + model.addPropertyChangeListener(NumberEditor2Model.PROPERTY_TEXT_VALUE, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + + String newValue = (String) evt.getNewValue(); + setNumberValueFromTextValue(newValue); + + } + }); + + } + Object bean = model.getBean(); + + if (bean != null) { + + String property = config.getProperty(); + + if (property != null) { + + Method mutator = BeanUtil.getMutator(bean, property); + + // check mutator exists + Preconditions.checkNotNull(mutator, "could not find mutator for " + property); + + // check type is ok + Class<?>[] parameterTypes = mutator.getParameterTypes(); + Preconditions.checkNotNull(parameterTypes[0].equals(numberType), "Mismatch mutator type, required a " + numberType + " but was " + parameterTypes[0]); + + // When model number changed, let's push it back in bean + model.addPropertyChangeListener( + NumberEditor2Model.PROPERTY_NUMBER_VALUE, + new MutateOnConditionalPropertyChangeListener<NumberEditor2Model>(model, mutator, model.canUpdateBeanNumberValuePredicate())); + + } + } + + { + // Add some listeners on ui + + ui.addPropertyChangeListener(NumberEditor2.PROPERTY_SHOW_POPUP_BUTTON, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (ui.getPopup().isVisible()) { + setPopupVisible(false); + } + } + }); + + ui.addPropertyChangeListener(NumberEditor2.PROPERTY_AUTO_POPUP, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (ui.getPopup().isVisible()) { + setPopupVisible(false); + } + } + }); + + ui.addPropertyChangeListener(NumberEditor2.PROPERTY_POPUP_VISIBLE, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + setPopupVisible((Boolean) evt.getNewValue()); + } + }); + ui.getTextField().addMouseListener(new PopupListener()); + + } + + // apply incoming number value + Number numberValue = model.getNumberValue(); + setTextValueFromNumberValue(numberValue); + + } + + protected void setNumberPattern(String newPattern) { + + try { + this.numberPattern = Pattern.compile(newPattern); + } catch (Exception e) { + throw new IllegalStateException("Could not compute numberPattern " + newPattern + " on " + ui, e); + } + + if (log.isInfoEnabled()) { + log.info("init numberPattern: " + numberPattern + " on " + ui); + } + + } + + protected void setNumberValueFromTextValue(String textValue) { + + if (ui.getModel().isNumberValueIsAdjusting()) { + // do nothing if number value is already adjusting + return; + } + + Number numberValue; + + if (StringUtils.isBlank(textValue)) { + + numberValue = null; + + } else { + + numberValue = numberParserFormatter.parse(textValue); + + } + + if (log.isInfoEnabled()) { + log.info("Set numberValue " + numberValue + " from textValue " + textValue); + } + ui.getModel().setNumberValue(numberValue); + } + + protected void setTextValueFromNumberValue(Number numberValue) { + + if (ui.getModel().isTextValueIsAdjusting()) { + // do nothing if text value is already adjusting + return; + } + + String textValue; + + if (numberValue == null) { + + textValue = numberParserFormatter.format(numberValue); + + } else { + + textValue = String.valueOf(numberValue); + + } + + if (log.isInfoEnabled()) { + log.info("Set textValue " + textValue + " from numberValue " + numberValue); + } + ui.getModel().setTextValue(textValue); + + } + + protected void validate() { + + setPopupVisible(false); + // fire validate property (to be able to notify listeners) + ui.firePropertyChange(VALIDATE_PROPERTY, null, true); + } + + protected class PopupListener extends MouseAdapter { + + @Override + public void mousePressed(MouseEvent e) { + maybeShowPopup(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + maybeShowPopup(e); + } + + protected void maybeShowPopup(MouseEvent e) { + if (!e.isPopupTrigger()) { + return; + } + if (ui.isAutoPopup()) { + if (ui.isPopupVisible()) { + if (!ui.getPopup().isVisible()) { + setPopupVisible(true); + } + // popup already visible + + } else { + // set popup auto + ui.setPopupVisible(true); + + } + } else { + if (ui.isPopupVisible()) { + setPopupVisible(true); + } + } + } + } + + static interface NumberParserFormatter<N extends Number> { + + N parse(String textValue); + + String format(N numberValue); + + } + + + protected static NumberParserFormatter<?> getNumberFactory(final Class<?> numberType) { + + if (numberFactories == null) { + + numberFactories = new HashMap<Class<?>, NumberParserFormatter<?>>(); + + NumberParserFormatter<Byte> byteSupport = new NumberParserFormatter<Byte>() { + @Override + public String format(Byte numberValue) { + return numberValue == null ? "" : String.valueOf(numberValue); + } + + @Override + public Byte parse(String textValue) { + return Byte.parseByte(textValue); + } + }; + numberFactories.put(byte.class, byteSupport); + numberFactories.put(Byte.class, byteSupport); + + NumberParserFormatter<Short> shortSupport = new NumberParserFormatter<Short>() { + @Override + public String format(Short numberValue) { + return numberValue == null ? "" : String.valueOf(numberValue); + } + + @Override + public Short parse(String textValue) { + return Short.parseShort(textValue); + } + }; + numberFactories.put(short.class, shortSupport); + numberFactories.put(Short.class, shortSupport); + + NumberParserFormatter<Integer> integerSupport = new NumberParserFormatter<Integer>() { + @Override + public String format(Integer numberValue) { + return numberValue == null ? "" : String.valueOf(numberValue); + } + + @Override + public Integer parse(String textValue) { + return Integer.parseInt(textValue); + } + }; + numberFactories.put(int.class, integerSupport); + numberFactories.put(Integer.class, integerSupport); + + NumberParserFormatter<Float> floatSupport = new NumberParserFormatter<Float>() { + @Override + public String format(Float numberValue) { + return numberValue == null ? "" : String.valueOf(numberValue); + } + + @Override + public Float parse(String textValue) { + return Float.parseFloat(textValue); + } + }; + numberFactories.put(float.class, floatSupport); + numberFactories.put(Float.class, floatSupport); + + NumberParserFormatter<Double> doubleSupport = new NumberParserFormatter<Double>() { + @Override + public String format(Double numberValue) { + return numberValue == null ? "" : String.valueOf(numberValue); + } + + @Override + public Double parse(String textValue) { + return Double.parseDouble(textValue); + } + }; + numberFactories.put(double.class, doubleSupport); + numberFactories.put(Double.class, doubleSupport); + NumberParserFormatter<BigInteger> bigIntegerSupport = new NumberParserFormatter<BigInteger>() { + @Override + public String format(BigInteger numberValue) { + return numberValue == null ? "" : String.valueOf(numberValue); + } + + @Override + public BigInteger parse(String textValue) { + return new BigInteger(textValue); + } + }; + numberFactories.put(BigInteger.class, bigIntegerSupport); + NumberParserFormatter<BigDecimal> bigDecimalSupport = new NumberParserFormatter<BigDecimal>() { + @Override + public String format(BigDecimal numberValue) { + return numberValue == null ? "" : String.valueOf(numberValue); + } + + @Override + public BigDecimal parse(String textValue) { + return new BigDecimal(textValue); + } + }; + numberFactories.put(BigDecimal.class, bigDecimalSupport); + + } + + for (Map.Entry<Class<?>, NumberParserFormatter<?>> entry : numberFactories.entrySet()) { + + if (entry.getKey().equals(numberType)) { + + return entry.getValue(); + + } + + } + + throw new IllegalArgumentException("Could not find a NumberFactory for type " + numberType); + + } + +} diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Model.java b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Model.java new file mode 100644 index 0000000..24572d0 --- /dev/null +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Model.java @@ -0,0 +1,176 @@ +package org.nuiton.jaxx.widgets.editor.number; + +import com.google.common.base.Predicate; +import org.apache.commons.lang3.StringUtils; +import org.jdesktop.beans.AbstractSerializableBean; +import org.nuiton.jaxx.widgets.ModelToBean; + +import java.io.Serializable; + +/** + * Created on 11/23/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.17 + */ +public class NumberEditor2Model extends AbstractSerializableBean implements ModelToBean { + + private static final long serialVersionUID = 1L; + + public static final String PROPERTY_BEAN = "bean"; + + public static final String PROPERTY_TEXT_VALUE = "textValue"; + + public static final String PROPERTY_NUMBER_VALUE = "numberValue"; + + public static final String PROPERTY_NUMBER_PATTERN = "numberPattern"; + + private final NumberEditor2Config config; + + /** Optional bean where to push data. */ + protected Serializable bean; + + /** + * Current text representation of the number (this value is always displayed in editor). + * + * Meanwhile the value can be different than the string represention of the numberValue, for example we can have as + * textValue {@code 0.} which represents the number {@code 0}. + */ + protected String textValue; + + /** + * Current number value of the editor. + */ + protected Number numberValue; + + /** + * Optional pattern to validate input text. + */ + protected String numberPattern; + + /** + * To avoid reentrant code while adjusting text value. + */ + protected boolean textValueIsAdjusting; + + /** + * To avoid reentrant code while adjusting number value. + */ + protected boolean numberValueIsAdjusting; + + public NumberEditor2Model(NumberEditor2Config config) { + this.config = config; + } + + NumberEditor2Config getConfig() { + return config; + } + + @Override + public Serializable getBean() { + return bean; + } + + public void setBean(Serializable bean) { + this.bean = bean; + } + + public String getNumberPattern() { + return numberPattern; + } + + public void setNumberPattern(String numberPattern) { + + String oldValue = getNumberPattern(); + this.numberPattern = numberPattern; + firePropertyChange(PROPERTY_NUMBER_PATTERN, oldValue, numberPattern); + + } + + public Number getNumberValue() { + return numberValue; + } + + public void setNumberValue(Number numberValue) { + + if (!numberValueIsAdjusting) { + + numberValueIsAdjusting = true; + + try { + Number oldValue = getNumberValue(); + this.numberValue = numberValue; + firePropertyChange(PROPERTY_NUMBER_VALUE, oldValue, numberValue); + } finally { + + numberValueIsAdjusting = false; + + } + + } + + } + + public String getTextValue() { + return textValue; + } + + public void setTextValue(String textValue) { + + if (!textValueIsAdjusting) { + + textValueIsAdjusting = true; + + try { + String oldValue = getTextValue(); + this.textValue = textValue; + firePropertyChange(PROPERTY_TEXT_VALUE, oldValue, textValue); + firePropertyChange("canUseDot", null, isCanUseDot()); + firePropertyChange("canUseSign", null, isCanUseSign()); + firePropertyChange("canUseZero", null, isCanUseZero()); + firePropertyChange("canClearAll", null, isCanClearAll()); + } finally { + + textValueIsAdjusting = false; + + } + + } + + } + + public boolean isCanUseDot() { + Boolean useDecimal = config.getUseDecimal(); + return useDecimal != null && useDecimal && !textValue.contains("."); + } + + public boolean isCanUseSign() { + return config.isUseSign() && StringUtils.isNotBlank(textValue); + } + + public boolean isCanUseZero() { + return StringUtils.isNotBlank(textValue) && "0".equals(textValue); + } + + public boolean isCanClearAll() { + return StringUtils.isNotBlank(textValue); + } + + public boolean isTextValueIsAdjusting() { + return textValueIsAdjusting; + } + + public boolean isNumberValueIsAdjusting() { + return numberValueIsAdjusting; + } + + protected Predicate<NumberEditor2Model> canUpdateBeanNumberValuePredicate() { + return new Predicate<NumberEditor2Model>() { + @Override + public boolean apply(NumberEditor2Model input) { + return true; + } + }; + } + +} -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/3074 in repository jaxx. See http://git.nuiton.org/jaxx.git commit 522e7a5547358195aa5868b81394c6ab8e4aa80d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 18:50:01 2014 +0100 deprecates NumberCellEditor and replace it with new one at org.nuiton.jaxx.widgets.editor.cell package --- .../swing/editor/cell/NumberCellEditor.java | 3 +- .../widgets}/editor/cell/NumberCellEditor.java | 71 +++++++++------------- 2 files changed, 31 insertions(+), 43 deletions(-) diff --git a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/cell/NumberCellEditor.java b/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/cell/NumberCellEditor.java index 82cd0c6..df1222c 100644 --- a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/cell/NumberCellEditor.java +++ b/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/cell/NumberCellEditor.java @@ -25,7 +25,6 @@ import java.awt.Component; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.AbstractCellEditor; -import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; @@ -37,7 +36,9 @@ import jaxx.runtime.swing.editor.NumberEditor; /** * @author sletellier <letellier@codelutin.com> + * @deprecated since 2.17, prefer use {@link org.nuiton.jaxx.widgets.editor.cell.NumberCellEditor}. */ +@Deprecated public class NumberCellEditor<E extends Number> extends AbstractCellEditor implements TableCellEditor, FocusListener, AncestorListener { diff --git a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/cell/NumberCellEditor.java b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/cell/NumberCellEditor.java similarity index 63% copy from jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/cell/NumberCellEditor.java copy to jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/cell/NumberCellEditor.java index 82cd0c6..8c53b2c 100644 --- a/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/cell/NumberCellEditor.java +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/cell/NumberCellEditor.java @@ -1,81 +1,68 @@ -/* - * #%L - * JAXX :: Widgets - * %% - * Copyright (C) 2008 - 2014 Code Lutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ -package jaxx.runtime.swing.editor.cell; +package org.nuiton.jaxx.widgets.editor.cell; + +import jaxx.runtime.swing.editor.NumberEditor; +import org.nuiton.jaxx.widgets.editor.number.NumberEditor2; +import org.nuiton.jaxx.widgets.editor.number.NumberEditor2Model; -import java.awt.Component; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; import javax.swing.AbstractCellEditor; -import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; import javax.swing.table.TableCellEditor; -import jaxx.runtime.JAXXUtil; -import jaxx.runtime.swing.editor.NumberEditor; +import java.awt.Component; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; /** - * @author sletellier <letellier@codelutin.com> + * Created on 11/23/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.17 */ public class NumberCellEditor<E extends Number> extends AbstractCellEditor implements TableCellEditor, FocusListener, AncestorListener { private static final long serialVersionUID = 1L; - protected final NumberEditor numberEditor; + protected final NumberEditor2 numberEditor; /** constructor */ public NumberCellEditor(Class<E> type, boolean useSign) { - numberEditor = new NumberEditor(); + numberEditor = new NumberEditor2(); numberEditor.getTextField().setHorizontalAlignment(SwingConstants.RIGHT); numberEditor.getTextField().setBorder(null); numberEditor.getTextField().addFocusListener(this); numberEditor.getTextField().addAncestorListener(this); - numberEditor.setModelType(type); - + numberEditor.setNumberType(type); numberEditor.setUseSign(useSign); numberEditor.init(); + } @Override - public Component getTableCellEditorComponent(JTable table, Object value, - boolean isSelected, int row, int column) { + public Component getTableCellEditorComponent(JTable table, + Object value, + boolean isSelected, + int row, + int column) { E number = (E) value; - numberEditor.setModel(number); - numberEditor.setModelText(JAXXUtil.getStringValue(number)); + numberEditor.setNumberValue(number); +// numberEditor.setModelText(JAXXUtil.getStringValue(number)); return numberEditor; } - public NumberEditor getNumberEditor() { + public NumberEditor2 getNumberEditor() { return numberEditor; } @Override public E getCellEditorValue() { - return (E)numberEditor.getModel(); + NumberEditor2Model model = numberEditor.getModel(); + return (E) model.getNumberValue(); } @Override @@ -117,9 +104,9 @@ public class NumberCellEditor<E extends Number> extends AbstractCellEditor boolean result = super.stopCellEditing(); // Reset previous data to avoid keeping it on other cell edition if (result) { - numberEditor.setModel(null); - // Use empty string, otherwise there is a NPE in NumberEditorHandler - numberEditor.setModelText(""); + numberEditor.setNumberValue(null); +// // Use empty string, otherwise there is a NPE in NumberEditorHandler +// numberEditor.setModelText(""); // force binding, I do not know why the textfield text is not emptied // if we do not force it numberEditor.applyDataBinding(NumberEditor.BINDING_TEXT_FIELD_TEXT); -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/3074 in repository jaxx. See http://git.nuiton.org/jaxx.git commit 3f5d85c7b88dab2fb280d6245f6d2a9c6b0c71ba Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 18:50:27 2014 +0100 add demo for NumberEditor2 --- .../component/jaxx/editor/NumberEditor2Demo.css | 94 ++++++++++++++++++ .../component/jaxx/editor/NumberEditor2Demo.jaxx | 110 +++++++++++++++++++++ .../jaxx/editor/NumberEditor2DemoHandler.java | 34 +++++++ .../jaxx/editor/NumberEditor2DemoModel.java | 50 ++++++++++ .../main/java/jaxx/demo/tree/DemoDataProvider.java | 14 +-- .../main/resources/i18n/jaxx-demo_en_GB.properties | 6 ++ .../main/resources/i18n/jaxx-demo_es_ES.properties | 6 ++ .../main/resources/i18n/jaxx-demo_fr_FR.properties | 6 ++ jaxx-demo/src/main/resources/log4j.properties | 1 + 9 files changed, 315 insertions(+), 6 deletions(-) diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2Demo.css b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2Demo.css new file mode 100644 index 0000000..64fabf5 --- /dev/null +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2Demo.css @@ -0,0 +1,94 @@ + +NumberEditor2 { + bean: {model}; + autoPopup:{autoPopupButton.isSelected()}; + showPopupButton:{showPopupButton.isSelected()}; + showReset:{showResetButton.isSelected()}; +} + +#numberEditorConfigurationPanel { + border:{new TitledBorder(t("jaxxdemo.numbereditor.configuration"))}; +} + +#showPopupButton { + text:"jaxxdemo.numbereditor.showPopupButton"; + selected:true; +} + +#showResetButton { + text:"jaxxdemo.numbereditor.showReset"; + selected:true; +} + +#autoPopupButton { + text:"jaxxdemo.numbereditor.autoPopup"; + selected:false; +} + +#integerNumberConfig { + text:"jaxxdemo.numbereditor.integerNumberConfig"; + labelFor:{integerNumberPattern}; +} + +#floatNumberConfig { + text:"jaxxdemo.numbereditor.floatNumberConfig"; + labelFor:{floatNumberPattern}; +} + +#doubleNumberConfig { + text:"jaxxdemo.numbereditor.doubleNumberConfig"; + labelFor:{doubleNumberPattern}; +} + +#integerNumberEnabled { + selected:true; +} + +#floatNumberEnabled { + selected:true; +} + +#doubleNumberEnabled { + selected:true; +} + + +#integerEditor { + property:integerNumber; + numberValue: {model.getIntegerNumber()}; + numberType:{Integer.class}; + numberPattern:{integerNumberPattern.getText()}; + enabled:{integerNumberEnabled.isSelected()}; +} + +#floatEditor { + property:floatNumber; + numberValue: {model.getFloatNumber()}; + numberType:{Float.class}; + numberPattern:{floatNumberPattern.getText()}; + enabled:{floatNumberEnabled.isSelected()}; +} + +#doubleEditor { + property:doubleNumber; + numberValue: {model.getDoubleNumber()}; + numberType:{Double.class}; + numberPattern:{doubleNumberPattern.getText()}; + enabled:{doubleNumberEnabled.isSelected()}; +} + +#resultPanel { + border:{new TitledBorder(t("jaxxdemo.numbereditor.model"))}; +} + +#resultInteger{ + text:{t("jaxxdemo.numbereditor.model.integer", model.getIntegerNumber())}; +} + +#resultFloat{ + text:{t("jaxxdemo.numbereditor.model.float", model.getFloatNumber())}; +} + +#resultDouble{ + text:{t("jaxxdemo.numbereditor.model.double", model.getDoubleNumber())}; +} \ No newline at end of file diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2Demo.jaxx b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2Demo.jaxx new file mode 100644 index 0000000..3207c79 --- /dev/null +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2Demo.jaxx @@ -0,0 +1,110 @@ +<!-- + #%L + JAXX :: Demo + %% + Copyright (C) 2008 - 2014 Code Lutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Lesser Public License for more details. + + You should have received a copy of the GNU General Lesser Public + License along with this program. If not, see + <http://www.gnu.org/licenses/lgpl-3.0.html>. + #L% + --> + +<jaxx.demo.DemoPanel layout='{new BorderLayout()}'> + + <import> + org.nuiton.jaxx.widgets.editor.number.NumberEditor2 + static org.nuiton.i18n.I18n.t + </import> + + <NumberEditor2DemoModel id='model' initializer="getContextValue(NumberEditor2DemoModel.class)"/> + + <Table insets='0' fill='both' weightx='1' constraints='BorderLayout.NORTH'> + <!-- config --> + <row> + <cell> + <Table id='numberEditorConfigurationPanel' insets='1' fill='both' weightx='1'> + <row> + <cell columns="3"> + <JCheckBox id='showPopupButton'/> + </cell> + </row> + <row> + <cell columns="3"> + <JCheckBox id='showResetButton'/> + </cell> + </row> + <row> + <cell columns="3"> + <JCheckBox id='autoPopupButton'/> + </cell> + </row> + <row> + <cell anchor="west"> + <JLabel id='integerNumberConfig'/> + </cell> + <cell weightx="1" fill="both"> + <JTextField id='integerNumberPattern' text='{"-?\\d{0,3}"}'/> + </cell> + <cell anchor="east"> + <JCheckBox id='integerNumberEnabled'/> + </cell> + </row> + <row> + <cell anchor="west"> + <JLabel id='floatNumberConfig'/> + </cell> + <cell weightx="1" fill="both"> + <JTextField id='floatNumberPattern' text='{"\\d{0,1}.\\d{0,2}"}'/> + </cell> + <cell anchor="east"> + <JCheckBox id='floatNumberEnabled'/> + </cell> + </row> + <row> + <cell anchor="west"> + <JLabel id='doubleNumberConfig'/> + </cell> + <cell weightx="1" fill="both"> + <JTextField id='doubleNumberPattern' text='{"-?\\d{0,4}.\\d{0,6}"}'/> + </cell> + <cell anchor="east"> + <JCheckBox id='doubleNumberEnabled'/> + </cell> + </row> + </Table> + </cell> + </row> + <!-- editors --> + <row> + <cell> + <JPanel layout="{new GridLayout()}"> + <NumberEditor2 id='integerEditor' constructorParams='this'/> + <NumberEditor2 id='floatEditor' constructorParams='this'/> + <NumberEditor2 id='doubleEditor' constructorParams='this'/> + </JPanel> + </cell> + </row> + <!-- result --> + <row> + <cell> + <JPanel id='resultPanel' layout='{new GridLayout(0,1)}'> + <JLabel id='resultInteger'/> + <JLabel id='resultFloat'/> + <JLabel id='resultDouble'/> + </JPanel> + </cell> + </row> + </Table> +</jaxx.demo.DemoPanel> + diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2DemoHandler.java b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2DemoHandler.java new file mode 100644 index 0000000..26129ee --- /dev/null +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2DemoHandler.java @@ -0,0 +1,34 @@ +package jaxx.demo.component.jaxx.editor; + +import jaxx.runtime.spi.UIHandler; + +/** + * Created on 11/23/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since XXX + */ +public class NumberEditor2DemoHandler implements UIHandler<NumberEditor2Demo> { + + @Override + public void beforeInit(NumberEditor2Demo ui) { + + NumberEditor2DemoModel model = new NumberEditor2DemoModel(); + model.setIntegerNumber(10); + model.setFloatNumber(-10.10f); + model.setDoubleNumber(-0.0001d); + + ui.setContextValue(model); + + } + + @Override + public void afterInit(NumberEditor2Demo ui) { + + ui.integerEditor.init(); + ui.floatEditor.init(); + ui.doubleEditor.init(); + + } + +} diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2DemoModel.java b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2DemoModel.java new file mode 100644 index 0000000..4291267 --- /dev/null +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditor2DemoModel.java @@ -0,0 +1,50 @@ +package jaxx.demo.component.jaxx.editor; + +import org.jdesktop.beans.AbstractSerializableBean; + +/** + * Created on 11/23/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.17 + */ +public class NumberEditor2DemoModel extends AbstractSerializableBean { + + private static final long serialVersionUID = 1L; + + protected Integer integerNumber; + + protected Float floatNumber; + + protected Double doubleNumber; + + public Integer getIntegerNumber() { + return integerNumber; + } + + public void setIntegerNumber(Integer integerNumber) { + Number oldValue = getIntegerNumber(); + this.integerNumber = integerNumber; + firePropertyChange("integerNumber", oldValue, integerNumber); + } + + public Float getFloatNumber() { + return floatNumber; + } + + public void setFloatNumber(Float floatNumber) { + Number oldValue = getFloatNumber(); + this.floatNumber = floatNumber; + firePropertyChange("floatNumber", oldValue, floatNumber); + } + + public Double getDoubleNumber() { + return doubleNumber; + } + + public void setDoubleNumber(Double doubleNumber) { + Number oldValue = getDoubleNumber(); + this.doubleNumber = doubleNumber; + firePropertyChange("doubleNumber", oldValue, doubleNumber); + } +} diff --git a/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java b/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java index 08f7081..1237f83 100644 --- a/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java +++ b/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java @@ -25,17 +25,20 @@ package jaxx.demo.tree; import jaxx.demo.component.jaxx.BoxedDecoratorDemo; import jaxx.demo.component.jaxx.StatusMessagePanelDemo; import jaxx.demo.component.jaxx.editor.BeanComboBoxDemo; +import jaxx.demo.component.jaxx.editor.BeanDoubleListDemo; +import jaxx.demo.component.jaxx.editor.BeanFilterableComboBoxDemo; import jaxx.demo.component.jaxx.editor.ComboEditorDemo; -import jaxx.demo.component.jaxx.editor.datetime.DateTimeEditorDemo; -import jaxx.demo.component.jaxx.editor.gis.CoordinateDemo; -import jaxx.demo.component.jaxx.editor.gis.CoordinatesEditorDemo; import jaxx.demo.component.jaxx.editor.DatePickerDemo; import jaxx.demo.component.jaxx.editor.FileEditorDemo; import jaxx.demo.component.jaxx.editor.I18nEditorDemo; import jaxx.demo.component.jaxx.editor.ListSelectorDemo; +import jaxx.demo.component.jaxx.editor.NumberEditor2Demo; import jaxx.demo.component.jaxx.editor.NumberEditorDemo; import jaxx.demo.component.jaxx.editor.SimpleTimeEditorDemo; import jaxx.demo.component.jaxx.editor.TimeEditorDemo; +import jaxx.demo.component.jaxx.editor.datetime.DateTimeEditorDemo; +import jaxx.demo.component.jaxx.editor.gis.CoordinateDemo; +import jaxx.demo.component.jaxx.editor.gis.CoordinatesEditorDemo; import jaxx.demo.component.swing.HidorButtonDemo; import jaxx.demo.component.swing.JButtonDemo; import jaxx.demo.component.swing.JCheckBoxDemo; @@ -57,9 +60,9 @@ import jaxx.demo.component.swing.JToggleButtonDemo; import jaxx.demo.feature.databinding.BeanDataBindingDemo; import jaxx.demo.feature.databinding.BindingExtremeDemo; import jaxx.demo.feature.nav.NavDemo; +import jaxx.demo.feature.validation.list.ListBeanValidationDemo; import jaxx.demo.feature.validation.simple.SimpleBeanValidationByListDemo; import jaxx.demo.feature.validation.simple.SimpleBeanValidationByTableDemo; -import jaxx.demo.feature.validation.list.ListBeanValidationDemo; import jaxx.demo.fun.CalculatorDemo; import jaxx.demo.fun.CounterDemo; import jaxx.demo.fun.LabelStyleDemo; @@ -72,8 +75,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import jaxx.demo.component.jaxx.editor.BeanDoubleListDemo; -import jaxx.demo.component.jaxx.editor.BeanFilterableComboBoxDemo; import static org.nuiton.i18n.I18n.n; /** @@ -159,6 +160,7 @@ public class DemoDataProvider implements NavDataProvider { addMapping(n("jaxxdemo.component.jaxx.editor"), TimeEditorDemo.class, SimpleTimeEditorDemo.class, + NumberEditor2Demo.class, NumberEditorDemo.class, ComboEditorDemo.class, I18nEditorDemo.class, diff --git a/jaxx-demo/src/main/resources/i18n/jaxx-demo_en_GB.properties b/jaxx-demo/src/main/resources/i18n/jaxx-demo_en_GB.properties index 7690f20..24b70f7 100644 --- a/jaxx-demo/src/main/resources/i18n/jaxx-demo_en_GB.properties +++ b/jaxx-demo/src/main/resources/i18n/jaxx-demo_en_GB.properties @@ -305,7 +305,13 @@ jaxxdemo.navigation.movies.title=Movies jaxxdemo.numbereditor.applyNumberPattern=Apply pattern jaxxdemo.numbereditor.autoPopup=Show automatic popup jaxxdemo.numbereditor.configuration=Configuration +jaxxdemo.numbereditor.doubleNumberConfig=Double editor (pattern / enable) +jaxxdemo.numbereditor.floatNumberConfig=Float editor (pattern / enable) +jaxxdemo.numbereditor.integerNumberConfig=Integer editor (pattern / enable) jaxxdemo.numbereditor.model=Result +jaxxdemo.numbereditor.model.double=Valeur Double \: %s +jaxxdemo.numbereditor.model.float=Valeur Float \: %s +jaxxdemo.numbereditor.model.integer=Valeur Integer \: %s jaxxdemo.numbereditor.numberPattern.configuration=Number Pattern jaxxdemo.numbereditor.showPopupButton=Show Popup button jaxxdemo.numbereditor.showReset=Show reset button diff --git a/jaxx-demo/src/main/resources/i18n/jaxx-demo_es_ES.properties b/jaxx-demo/src/main/resources/i18n/jaxx-demo_es_ES.properties index e88831b..7d88871 100644 --- a/jaxx-demo/src/main/resources/i18n/jaxx-demo_es_ES.properties +++ b/jaxx-demo/src/main/resources/i18n/jaxx-demo_es_ES.properties @@ -311,6 +311,12 @@ jaxxdemo.navigation.movies.title=Films jaxxdemo.numbereditor.applyNumberPattern=Appliquer le pattern jaxxdemo.numbereditor.autoPopup=Affichage automatique popup jaxxdemo.numbereditor.configuration=Configuration +jaxxdemo.numbereditor.doubleNumberConfig= +jaxxdemo.numbereditor.doubleNumberPattern= +jaxxdemo.numbereditor.floatNumberConfig= +jaxxdemo.numbereditor.floatNumberPattern= +jaxxdemo.numbereditor.integerNumberConfig= +jaxxdemo.numbereditor.integerNumberPattern= jaxxdemo.numbereditor.model=Résultat jaxxdemo.numbereditor.numberPattern.configuration=Pattern du nombre jaxxdemo.numbereditor.showPopupButton=Afficher le boutton de popup diff --git a/jaxx-demo/src/main/resources/i18n/jaxx-demo_fr_FR.properties b/jaxx-demo/src/main/resources/i18n/jaxx-demo_fr_FR.properties index fd9ecc4..7911f68 100644 --- a/jaxx-demo/src/main/resources/i18n/jaxx-demo_fr_FR.properties +++ b/jaxx-demo/src/main/resources/i18n/jaxx-demo_fr_FR.properties @@ -305,7 +305,13 @@ jaxxdemo.navigation.movies.title=Films jaxxdemo.numbereditor.applyNumberPattern=Appliquer le pattern jaxxdemo.numbereditor.autoPopup=Affichage automatique popup jaxxdemo.numbereditor.configuration=Configuration +jaxxdemo.numbereditor.doubleNumberConfig=Éditeur Double (pattern / actif) +jaxxdemo.numbereditor.floatNumberConfig=Éditeur Float (pattern / actif) +jaxxdemo.numbereditor.integerNumberConfig=Éditeur Integer (pattern / actif) jaxxdemo.numbereditor.model=Résultat +jaxxdemo.numbereditor.model.double=Valeur Double \: %s +jaxxdemo.numbereditor.model.float=Valeur Float \: %s +jaxxdemo.numbereditor.model.integer=Valeur Integer \: %s jaxxdemo.numbereditor.numberPattern.configuration=Pattern du nombre jaxxdemo.numbereditor.showPopupButton=Afficher le boutton de popup jaxxdemo.numbereditor.showReset=Afficher le boutton de reset diff --git a/jaxx-demo/src/main/resources/log4j.properties b/jaxx-demo/src/main/resources/log4j.properties index d7e579b..a793374 100644 --- a/jaxx-demo/src/main/resources/log4j.properties +++ b/jaxx-demo/src/main/resources/log4j.properties @@ -35,4 +35,5 @@ log4j.logger.jaxx=INFO #log4j.logger.jaxx.runtime.swing.editor.config=INFO #log4j.logger.jaxx.runtime.swing.editor.config.model.ConfigUIModelBuilder=DEBUG log4j.logger.org.nuiton=WARN +log4j.logger.org.nuiton.jaxx=INFO #log4j.logger.jaxx.runtime.swing.help=DEBUG -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/3074 in repository jaxx. See http://git.nuiton.org/jaxx.git commit bfda7bce2deefb1f1f0e6dac274c3c1173b39475 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 23 19:09:22 2014 +0100 Ne pas formatter les petits nombres decimaux en notation scientifique --- .../jaxx/widgets/editor/number/NumberEditor2.jaxx | 1 - .../editor/number/NumberEditor2Handler.java | 51 ++++++++++++++++------ 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.jaxx b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.jaxx index 852acc1..a8f3bc6 100644 --- a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.jaxx +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2.jaxx @@ -91,7 +91,6 @@ public void setToolTipText(String toolTipText) { onPopupMenuWillBecomeVisible='showPopUpButton.setSelected(true)' onPopupMenuWillBecomeInvisible='showPopUpButton.setSelected(false)' onPopupMenuCanceled='showPopUpButton.setSelected(false)'> - <!--<style source='NumberEditorPopup.css'/>--> <JPanel id='popupPanel' layout='{new GridLayout(4,4)}'> <JButton id='number7Button' styleClass='digit' onActionPerformed="handler.addChar('7')"/> diff --git a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Handler.java b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Handler.java index 55e4e8e..ae04ff7 100644 --- a/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Handler.java +++ b/jaxx-widgets/src/main/java/org/nuiton/jaxx/widgets/editor/number/NumberEditor2Handler.java @@ -22,6 +22,7 @@ import java.beans.PropertyChangeListener; import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.BigInteger; +import java.text.DecimalFormat; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; @@ -452,17 +453,7 @@ public class NumberEditor2Handler implements UIHandler<NumberEditor2> { return; } - String textValue; - - if (numberValue == null) { - - textValue = numberParserFormatter.format(numberValue); - - } else { - - textValue = String.valueOf(numberValue); - - } + String textValue = numberParserFormatter.format(numberValue); if (log.isInfoEnabled()) { log.info("Set textValue " + textValue + " from numberValue " + numberValue); @@ -572,9 +563,26 @@ public class NumberEditor2Handler implements UIHandler<NumberEditor2> { numberFactories.put(Integer.class, integerSupport); NumberParserFormatter<Float> floatSupport = new NumberParserFormatter<Float>() { + + final DecimalFormat df = new DecimalFormat("#.######################"); + @Override public String format(Float numberValue) { - return numberValue == null ? "" : String.valueOf(numberValue); + String format; + if (numberValue == null) { + format = ""; + } else { + format = String.valueOf(numberValue); + if (format.contains("E")) { + + format = df.format(numberValue); + if (format.contains(",")) { + format = format.replace(",", "."); + } + + } + } + return format; } @Override @@ -586,9 +594,26 @@ public class NumberEditor2Handler implements UIHandler<NumberEditor2> { numberFactories.put(Float.class, floatSupport); NumberParserFormatter<Double> doubleSupport = new NumberParserFormatter<Double>() { + + final DecimalFormat df = new DecimalFormat("#.######################"); + @Override public String format(Double numberValue) { - return numberValue == null ? "" : String.valueOf(numberValue); + String format; + if (numberValue == null) { + format = ""; + } else { + format = String.valueOf(numberValue); + if (format.contains("E")) { + + format = df.format(numberValue); + if (format.contains(",")) { + format = format.replace(",", "."); + } + + } + } + return format; } @Override -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
participants (1)
-
nuiton.org scm