branch develop updated (e0f37a3 -> 12c4989)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository jaxx. See http://git.nuiton.org/jaxx.git from e0f37a3 fixes #3585 Merge branch 'feature/3585' into develop new f0d2776 refs #3501 - use widgets-common - fix i18n - fix property default value new 12c4989 refs #3501 add timeeditor (ng) + fix enable state + add it in demo The 2 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 12c49893ad8cc336543445311caa192628e99646 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 30 15:30:05 2014 +0100 refs #3501 add timeeditor (ng) + fix enable state + add it in demo commit f0d2776206680317d564e0f68c83cb5259f42893 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 30 14:16:50 2014 +0100 refs #3501 - use widgets-common - fix i18n - fix property default value Summary of changes: .../demo/component/jaxx/editor/TimeEditorDemo.jaxx | 24 +-- .../jaxx/widgets/datetime/DateTimeEditorDemo.css | 6 + .../jaxx/widgets/datetime/DateTimeEditorDemo.jaxx | 5 + .../TimeEditorDemo.css} | 54 ++--- ...DateTimeEditorDemo.jaxx => TimeEditorDemo.jaxx} | 21 +- .../widgets/datetime/TimeEditorDemoHandler.java | 44 ++++ .../jaxx/widgets/datetime/TimeEditorDemoModel.java | 28 +++ .../main/java/jaxx/demo/tree/DemoDataProvider.java | 3 +- .../main/resources/i18n/jaxx-demo_en_GB.properties | 8 +- .../main/resources/i18n/jaxx-demo_es_ES.properties | 8 + .../main/resources/i18n/jaxx-demo_fr_FR.properties | 8 +- jaxx-widgets-datetime/pom.xml | 7 + .../jaxx/widgets/datetime/DateTimeEditor.css | 2 +- .../jaxx/widgets/datetime/DateTimeEditor.jaxx | 2 +- .../widgets/datetime/DateTimeEditorHandler.java | 165 ++------------- .../jaxx/widgets/datetime/DateTimeEditorModel.java | 16 +- .../{DateTimeEditor.css => TimeEditor.css} | 18 +- .../{DateTimeEditor.jaxx => TimeEditor.jaxx} | 28 +-- .../jaxx/widgets/datetime/TimeEditorHandler.java | 211 +++++++++++++++++++ .../jaxx/widgets/datetime/TimeEditorModel.java | 223 +++++++++++++++++++++ .../widgets/datetime/TimeSliderInitializer.java | 152 ++++++++++++++ ...teTimeEditorState.java => TimeEditorState.java} | 20 +- .../i18n/jaxx-widgets-datetime_en_GB.properties | 5 +- .../i18n/jaxx-widgets-datetime_es_ES.properties | 9 +- .../i18n/jaxx-widgets-datetime_fr_FR.properties | 5 +- .../resources/icons/action-coordinate-reset.png | Bin 396 -> 0 bytes 26 files changed, 806 insertions(+), 266 deletions(-) copy jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/{gis/CoordinatesEditorDemo.css => datetime/TimeEditorDemo.css} (53%) copy jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/{DateTimeEditorDemo.jaxx => TimeEditorDemo.jaxx} (68%) create mode 100644 jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemoHandler.java create mode 100644 jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemoModel.java copy jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/{DateTimeEditor.css => TimeEditor.css} (82%) copy jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/{DateTimeEditor.jaxx => TimeEditor.jaxx} (69%) create mode 100644 jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditorHandler.java create mode 100644 jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditorModel.java create mode 100644 jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeSliderInitializer.java copy jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/session/{DateTimeEditorState.java => TimeEditorState.java} (65%) delete mode 100644 jaxx-widgets-datetime/src/main/resources/icons/action-coordinate-reset.png -- 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 develop in repository jaxx. See http://git.nuiton.org/jaxx.git commit f0d2776206680317d564e0f68c83cb5259f42893 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 30 14:16:50 2014 +0100 refs #3501 - use widgets-common - fix i18n - fix property default value --- jaxx-widgets-datetime/pom.xml | 7 +++ .../jaxx/widgets/datetime/DateTimeEditor.css | 2 +- .../jaxx/widgets/datetime/DateTimeEditor.jaxx | 2 +- .../widgets/datetime/DateTimeEditorHandler.java | 61 +++++---------------- .../jaxx/widgets/datetime/DateTimeEditorModel.java | 14 ++++- .../i18n/jaxx-widgets-datetime_en_GB.properties | 2 +- .../i18n/jaxx-widgets-datetime_es_ES.properties | 6 +- .../i18n/jaxx-widgets-datetime_fr_FR.properties | 2 +- .../resources/icons/action-coordinate-reset.png | Bin 396 -> 0 bytes 9 files changed, 40 insertions(+), 56 deletions(-) diff --git a/jaxx-widgets-datetime/pom.xml b/jaxx-widgets-datetime/pom.xml index ff03979..42dc418 100644 --- a/jaxx-widgets-datetime/pom.xml +++ b/jaxx-widgets-datetime/pom.xml @@ -41,6 +41,7 @@ <description>Date and time Widgets wrote with JAXX</description> <properties> + <jaxx.addProjectClassPath>true</jaxx.addProjectClassPath> <jaxx.addSourcesToClassPath>true</jaxx.addSourcesToClassPath> <jaxx.autoImportCss>true</jaxx.autoImportCss> <jaxx.addAutoHandlerUI>true</jaxx.addAutoHandlerUI> @@ -71,6 +72,12 @@ </dependency> <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>jaxx-widgets-common</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> <groupId>org.swinglabs.swingx</groupId> <artifactId>swingx-common</artifactId> </dependency> diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditor.css b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditor.css index e5f019a..a1886ae 100644 --- a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditor.css +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditor.css @@ -41,7 +41,7 @@ } #labelH { - text:"timeeditor.H"; + text:"datetimeeditor.H"; horizontalAlignment:center; } diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditor.jaxx b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditor.jaxx index 4fe2d25..5948b7c 100644 --- a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditor.jaxx +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditor.jaxx @@ -44,7 +44,7 @@ <SpinnerDateModel id="minuteModel"/> <!-- flag to show or hide the time slider (this state can be saved by SwingSession) --> - <Boolean id='showTimeEditorSlider' javaBean='false'/> + <Boolean id='showTimeEditorSlider' javaBean='true'/> <script><![CDATA[ public void init() { handler.init(this); } diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorHandler.java b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorHandler.java index 63e4538..235ef0d 100644 --- a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorHandler.java +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorHandler.java @@ -23,10 +23,11 @@ package org.nuiton.jaxx.widgets.datetime; */ import com.google.common.base.Preconditions; -import jaxx.runtime.JAXXUtil; +import com.google.common.base.Predicate; import jaxx.runtime.spi.UIHandler; 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.JLabel; @@ -36,8 +37,6 @@ import javax.swing.plaf.basic.BasicSliderUI; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.lang.reflect.Method; import java.util.Calendar; import java.util.Date; @@ -182,38 +181,40 @@ public class DateTimeEditorHandler implements UIHandler<DateTimeEditor> { if (bean != null) { + Predicate<DateTimeEditorModel> predicate = model.canUpdateBeanValuePredicate(); + if (model.getPropertyDayDate() != null) { - Method dayDateMutator = BeanUtil.getMutator(bean, model.getPropertyDayDate()); - Preconditions.checkNotNull(dayDateMutator, "could not find mutator for " + model.getPropertyDayDate()); + Method mutator = BeanUtil.getMutator(bean, model.getPropertyDayDate()); + Preconditions.checkNotNull(mutator, "could not find mutator for " + model.getPropertyDayDate()); // When model day date changed, let's push it back in bean model.addPropertyChangeListener( DateTimeEditorModel.PROPERTY_DAY_DATE, - new ModelPropertyChangeListener(model, dayDateMutator)); + new MutateOnConditionalPropertyChangeListener<DateTimeEditorModel>(model, mutator, predicate)); } if (model.getPropertyTimeDate() != null) { - Method timeDateMutator = BeanUtil.getMutator(bean, model.getPropertyTimeDate()); - Preconditions.checkNotNull(timeDateMutator, "could not find mutator for " + model.getPropertyTimeDate()); + Method mutator = BeanUtil.getMutator(bean, model.getPropertyTimeDate()); + Preconditions.checkNotNull(mutator, "could not find mutator for " + model.getPropertyTimeDate()); // When model time date changed, let's push it back in bean model.addPropertyChangeListener( DateTimeEditorModel.PROPERTY_TIME_DATE, - new ModelPropertyChangeListener(model, timeDateMutator)); + new MutateOnConditionalPropertyChangeListener<DateTimeEditorModel>(model, mutator, predicate)); } if (model.getPropertyDate() != null) { - Method fullDateMutator = BeanUtil.getMutator(bean, model.getPropertyDate()); - Preconditions.checkNotNull(fullDateMutator, "could not find mutator for " + model.getPropertyDate()); + Method mutator = BeanUtil.getMutator(bean, model.getPropertyDate()); + Preconditions.checkNotNull(mutator, "could not find mutator for " + model.getPropertyDate()); // When model full date changed, let's push it back in bean model.addPropertyChangeListener( DateTimeEditorModel.PROPERTY_DATE, - new ModelPropertyChangeListener(model, fullDateMutator)); + new MutateOnConditionalPropertyChangeListener<DateTimeEditorModel>(model, mutator, predicate)); } @@ -412,40 +413,4 @@ public class DateTimeEditorHandler implements UIHandler<DateTimeEditor> { model.setTimeInMinutes(hour * 60 + minute); } - private class ModelPropertyChangeListener implements PropertyChangeListener { - - private final DateTimeEditorModel model; - - private final Method mutator; - - private ModelPropertyChangeListener(DateTimeEditorModel model, Method mutator) { - this.model = model; - this.mutator = mutator; - } - - @Override - public void propertyChange(PropertyChangeEvent evt) { - - if (!model.isValueIsAdjusting()) { - - Object newValue = evt.getNewValue(); - - try { - -// valueModelIsAdjusting = true; -// try { - mutator.invoke(model.getBean(), newValue); -// } finally { -// valueModelIsAdjusting = false; -// } - - } catch (Exception e) { - throw new RuntimeException(e); - } - - } - - } - } - } diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorModel.java b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorModel.java index 59258b5..7e914b2 100644 --- a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorModel.java +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorModel.java @@ -23,7 +23,9 @@ package org.nuiton.jaxx.widgets.datetime; */ import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; import org.jdesktop.beans.AbstractSerializableBean; +import org.nuiton.jaxx.widgets.ModelToBean; import org.nuiton.util.DateUtil; import java.io.Serializable; @@ -37,7 +39,7 @@ import java.util.GregorianCalendar; * @author Tony Chemit - chemit@codelutin.com * @since 2.12 */ -public class DateTimeEditorModel extends AbstractSerializableBean { +public class DateTimeEditorModel extends AbstractSerializableBean implements ModelToBean { private static final long serialVersionUID = 1L; @@ -117,6 +119,7 @@ public class DateTimeEditorModel extends AbstractSerializableBean { this.propertyDate = propertyDate; } + @Override public Serializable getBean() { return bean; } @@ -357,4 +360,13 @@ public class DateTimeEditorModel extends AbstractSerializableBean { protected void fireValueIsAdjusting(boolean oldValue) { firePropertyChange(PROPERTY_VALUE_IS_ADJUSTING, oldValue, isValueIsAdjusting()); } + + protected Predicate<DateTimeEditorModel> canUpdateBeanValuePredicate() { + return new Predicate<DateTimeEditorModel>() { + @Override + public boolean apply(DateTimeEditorModel input) { + return !isValueIsAdjusting(); + } + }; + } } diff --git a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_en_GB.properties b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_en_GB.properties index bd1a16f..35ea065 100644 --- a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_en_GB.properties +++ b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_en_GB.properties @@ -1,3 +1,3 @@ +datetimeeditor.H=H datetimeeditor.hide.slider=hide time editor slider datetimeeditor.show.slider=show time editor slider -timeeditor.H= diff --git a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_es_ES.properties b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_es_ES.properties index 8a9ee97..35ea065 100644 --- a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_es_ES.properties +++ b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_es_ES.properties @@ -1,3 +1,3 @@ -datetimeeditor.hide.slider= -datetimeeditor.show.slider= -timeeditor.H= +datetimeeditor.H=H +datetimeeditor.hide.slider=hide time editor slider +datetimeeditor.show.slider=show time editor slider diff --git a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_fr_FR.properties b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_fr_FR.properties index b973d7c..53a7e65 100644 --- a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_fr_FR.properties +++ b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_fr_FR.properties @@ -1,3 +1,3 @@ +datetimeeditor.H=H datetimeeditor.hide.slider=Cacher la réglette d'édition des heures datetimeeditor.show.slider=Voir la réglette d'édition des heures -timeeditor.H= diff --git a/jaxx-widgets-datetime/src/main/resources/icons/action-coordinate-reset.png b/jaxx-widgets-datetime/src/main/resources/icons/action-coordinate-reset.png deleted file mode 100644 index 0fb00f9..0000000 Binary files a/jaxx-widgets-datetime/src/main/resources/icons/action-coordinate-reset.png and /dev/null differ -- 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 develop in repository jaxx. See http://git.nuiton.org/jaxx.git commit 12c49893ad8cc336543445311caa192628e99646 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 30 15:30:05 2014 +0100 refs #3501 add timeeditor (ng) + fix enable state + add it in demo --- .../demo/component/jaxx/editor/TimeEditorDemo.jaxx | 24 +-- .../jaxx/widgets/datetime/DateTimeEditorDemo.css | 6 + .../jaxx/widgets/datetime/DateTimeEditorDemo.jaxx | 5 + .../jaxx/widgets/datetime/TimeEditorDemo.css | 61 ++++++ ...DateTimeEditorDemo.jaxx => TimeEditorDemo.jaxx} | 21 +- .../widgets/datetime/TimeEditorDemoHandler.java | 44 ++++ .../jaxx/widgets/datetime/TimeEditorDemoModel.java | 28 +++ .../main/java/jaxx/demo/tree/DemoDataProvider.java | 3 +- .../main/resources/i18n/jaxx-demo_en_GB.properties | 8 +- .../main/resources/i18n/jaxx-demo_es_ES.properties | 8 + .../main/resources/i18n/jaxx-demo_fr_FR.properties | 8 +- .../widgets/datetime/DateTimeEditorHandler.java | 104 +--------- .../jaxx/widgets/datetime/DateTimeEditorModel.java | 2 - .../nuiton/jaxx/widgets/datetime/TimeEditor.css | 74 +++++++ .../nuiton/jaxx/widgets/datetime/TimeEditor.jaxx | 79 ++++++++ .../jaxx/widgets/datetime/TimeEditorHandler.java | 211 +++++++++++++++++++ .../jaxx/widgets/datetime/TimeEditorModel.java | 223 +++++++++++++++++++++ .../widgets/datetime/TimeSliderInitializer.java | 152 ++++++++++++++ .../widgets/datetime/session/TimeEditorState.java | 54 +++++ .../i18n/jaxx-widgets-datetime_en_GB.properties | 3 + .../i18n/jaxx-widgets-datetime_es_ES.properties | 3 + .../i18n/jaxx-widgets-datetime_fr_FR.properties | 3 + 22 files changed, 981 insertions(+), 143 deletions(-) diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx index ade8cf7..ba8fd3c 100644 --- a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx @@ -27,7 +27,7 @@ </import> <!-- model --> - <TimeEditorDemoModel id='demoModel'/> + <jaxx.demo.component.jaxx.editor.TimeEditorDemoModel id='demoModel'/> <script><![CDATA[ @@ -48,26 +48,6 @@ void $afterCompleteSetup() { <cell> <JPanel id="configPanel"> - <!--JCheckBox id='useFloat' - text='jaxxdemo.numbereditor.useFloat' - selected='true'/> - - <JCheckBox id='useSign' - text='jaxxdemo.numbereditor.useSign' - selected='true'/> - - <JCheckBox id='showPopupButton' - text='jaxxdemo.numbereditor.showPopupButton' - selected='true'/> - - <JCheckBox id='showResetButton' - text='jaxxdemo.numbereditor.showReset' - selected='true'/> - - <JCheckBox id='autoPopup' - text='jaxxdemo.numbereditor.autoPopup' - selected='false'/--> - <JPanel layout='{new BorderLayout()}'> <JLabel id='labelConfigLabel' constraints='BorderLayout.WEST'/> @@ -80,7 +60,7 @@ void $afterCompleteSetup() { </row> <row> <cell> - <TimeEditor id='editor' constructorParams='this' property='time' + <jaxx.runtime.swing.editor.TimeEditor id='editor' constructorParams='this' property='time' border='{new TitledBorder(t("jaxxdemo.timeeditor.editor"))}' bean='{demoModel}' date="{demoModel.getTime()}" diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.css b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.css index 1162fa8..e4b9333 100644 --- a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.css +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.css @@ -41,6 +41,11 @@ text:{t("jaxxdemo.datetimeeditor.configuration.format.value")}; } +#enableButton { + text: "jaxxdemo.datetimeeditor.enable"; + selected: true; +} + #editor { bean:{model}; propertyDate:date; @@ -50,6 +55,7 @@ date:{model.getDate()}; label:{labelConfig.getText()}; dateFormat:{formatConfig.getText()}; + enabled:{enableButton.isSelected()}; } #result { diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.jaxx b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.jaxx index cea6781..28826e5 100644 --- a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.jaxx +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.jaxx @@ -45,6 +45,11 @@ <JTextField id='formatConfig'/> </cell> </row> + <row> + <cell anchor='west' columns="2"> + <JCheckBox id='enableButton'/> + </cell> + </row> </Table> <DateTimeEditor id='editor' constructorParams='this' constraints='BorderLayout.CENTER'/> </JPanel> diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemo.css b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemo.css new file mode 100644 index 0000000..044a585 --- /dev/null +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemo.css @@ -0,0 +1,61 @@ +/* + * #%L + * JAXX :: Demo + * %% + * Copyright (C) 2008 - 2014 CodeLutin + * %% + * 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% + */ + +#configPanel { + border:{new TitledBorder(t("jaxxdemo.timeeditor.configuration"))}; + layout:{new GridLayout(0,1)}; +} + +#labelConfigLabel { + text:"jaxxdemo.timeeditor.configuration.label"; +} + +#labelConfig { + text:{t("jaxxdemo.timeeditor.configuration.label.value")}; +} + +#enableButton { + text: "jaxxdemo.timeeditor.enable"; + selected: true; +} + +#editor { + bean:{model}; + propertyTime:time; + border:{new TitledBorder(t("jaxxdemo.timeeditor.editor"))}; + time:{model.getTime()}; + label:{labelConfig.getText()}; + enabled:{enableButton.isSelected()}; +} + +#result { + border: {new TitledBorder(t("jaxxdemo.timeeditor.result"))}; +} + +#resultTimeLabel{ + text: "jaxxdemo.timeeditor.result.time"; +} + +#resultTime{ + editable:false; + text: {handler.getTime(model.getTime())}; +} diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.jaxx b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemo.jaxx similarity index 68% copy from jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.jaxx copy to jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemo.jaxx index cea6781..da5f3b0 100644 --- a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/DateTimeEditorDemo.jaxx +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemo.jaxx @@ -22,10 +22,10 @@ <jaxx.demo.DemoPanel layout='{new BorderLayout()}'> <import> - org.nuiton.jaxx.widgets.datetime.DateTimeEditor + org.nuiton.jaxx.widgets.datetime.TimeEditor </import> - <DateTimeEditorDemoModel id='model' initializer='getContextValue(DateTimeEditorDemoModel.class)'/> + <jaxx.demo.component.jaxx.widgets.datetime.TimeEditorDemoModel id='model' initializer='getContextValue(TimeEditorDemoModel.class)'/> <JPanel layout='{new BorderLayout()}' constraints='BorderLayout.NORTH'> <Table id="configPanel" constraints='BorderLayout.NORTH'> @@ -38,24 +38,17 @@ </cell> </row> <row> - <cell> - <JLabel id='formatConfigLabel'/> - </cell> - <cell fill='both' weightx='1'> - <JTextField id='formatConfig'/> + <cell anchor='west' columns="2"> + <JCheckBox id='enableButton'/> </cell> </row> </Table> - <DateTimeEditor id='editor' constructorParams='this' constraints='BorderLayout.CENTER'/> + <org.nuiton.jaxx.widgets.datetime.TimeEditor id='editor' constructorParams='this' constraints='BorderLayout.CENTER'/> </JPanel> <JPanel id='result' layout='{new GridLayout(0,2)}' constraints='BorderLayout.CENTER'> - <JLabel id='resultDateLabel'/> - <JTextField id='resultDate'/> - <JLabel id='resultDayDateLabel'/> - <JTextField id='resultDayDate'/> - <JLabel id='resultTimeDateLabel'/> - <JTextField id='resultTimeDate'/> + <JLabel id='resultTimeLabel'/> + <JTextField id='resultTime'/> </JPanel> </jaxx.demo.DemoPanel> diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemoHandler.java b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemoHandler.java new file mode 100644 index 0000000..2a75857 --- /dev/null +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemoHandler.java @@ -0,0 +1,44 @@ +package jaxx.demo.component.jaxx.widgets.datetime; + +import jaxx.runtime.spi.UIHandler; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created on 11/30/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.18 + */ +public class TimeEditorDemoHandler implements UIHandler<TimeEditorDemo> { + + protected final DateFormat timeFormat = new SimpleDateFormat("HH:mm"); + + @Override + public void beforeInit(TimeEditorDemo ui) { + + TimeEditorDemoModel model = new TimeEditorDemoModel(); + + Date now = new Date(); + + model.setTime(now); + + ui.setContextValue(model); + + } + + @Override + public void afterInit(final TimeEditorDemo ui) { + + // init editor + ui.getEditor().init(); + + } + + public String getTime(Date date) { + return timeFormat.format(date); + } + +} \ No newline at end of file diff --git a/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemoModel.java b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemoModel.java new file mode 100644 index 0000000..64cbcbf --- /dev/null +++ b/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/widgets/datetime/TimeEditorDemoModel.java @@ -0,0 +1,28 @@ +package jaxx.demo.component.jaxx.widgets.datetime; + +import org.jdesktop.beans.AbstractSerializableBean; + +import java.util.Date; + +/** + * Created on 11/30/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.18 + */ +public class TimeEditorDemoModel extends AbstractSerializableBean { + + private static final long serialVersionUID = 1L; + + protected Date time; + + public Date getTime() { + return time; + } + + public void setTime(Date time) { + Date oldValue = getTime(); + this.time = time; + firePropertyChange("time", oldValue, time); + } +} 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 c02fbc9..f28609c 100644 --- a/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java +++ b/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java @@ -179,7 +179,8 @@ public class DemoDataProvider implements NavDataProvider { ); addMapping(n("jaxxdemo.component.jaxx.widgets.datetime"), - DateTimeEditorDemo.class + DateTimeEditorDemo.class, + jaxx.demo.component.jaxx.widgets.datetime.TimeEditorDemo.class ); addMapping(n("jaxxdemo.component.jaxx.editor"), 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 6d427a8..081308b 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 @@ -264,10 +264,10 @@ jaxxdemo.datetimeeditor.configuration.format.value=yyyy/MM/dd jaxxdemo.datetimeeditor.configuration.label=Label of editor jaxxdemo.datetimeeditor.configuration.label.value=Date - Time jaxxdemo.datetimeeditor.editor=Editor +jaxxdemo.datetimeeditor.enable=Enable / Disable jaxxdemo.datetimeeditor.result=Result jaxxdemo.datetimeeditor.result.date=Date\: jaxxdemo.datetimeeditor.result.dayDate=Day\: -jaxxdemo.datetimeeditor.result.daydate= jaxxdemo.datetimeeditor.result.timeDate=Time\: jaxxdemo.feature=Features jaxxdemo.feature.databinding=Data Binding @@ -324,9 +324,15 @@ jaxxdemo.numbereditor.showReset=Show reset button jaxxdemo.numbereditor.useFloat=Use float jaxxdemo.numbereditor.useSign=Use Sign jaxxdemo.openHelp=Open contextual help (%s), Will come in 3.0 version +jaxxdemo.timeeditor.configuration=Configuration +jaxxdemo.timeeditor.configuration.label=Label of editor +jaxxdemo.timeeditor.configuration.label.value=Time\: jaxxdemo.timeeditor.editor=Time Editor +jaxxdemo.timeeditor.enable=Enable / Disable jaxxdemo.timeeditor.label=Label jaxxdemo.timeeditor.model=Result +jaxxdemo.timeeditor.result=Result +jaxxdemo.timeeditor.result.time=Time\: jaxxdemo.title.about=About JAXXDemo... jaxxdemo.title.showLog=JAXXDemo logs jaxxdemo.tree.tabtitle=Tree 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 7691328..91539b0 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 @@ -266,6 +266,7 @@ jaxxdemo.datetimeeditor.configuration.format.value= jaxxdemo.datetimeeditor.configuration.label= jaxxdemo.datetimeeditor.configuration.label.value= jaxxdemo.datetimeeditor.editor= +jaxxdemo.datetimeeditor.enable= jaxxdemo.datetimeeditor.label= jaxxdemo.datetimeeditor.result= jaxxdemo.datetimeeditor.result.date= @@ -274,6 +275,7 @@ jaxxdemo.datetimeeditor.result.daydate= jaxxdemo.datetimeeditor.result.hour= jaxxdemo.datetimeeditor.result.hours= jaxxdemo.datetimeeditor.result.minutes= +jaxxdemo.datetimeeditor.result.time= jaxxdemo.datetimeeditor.result.timeDate= jaxxdemo.datetimeeditor.result.timeInMinutes= jaxxdemo.datetimeeditor.result.timmeInMinutes= @@ -332,9 +334,15 @@ jaxxdemo.numbereditor.showReset=Afficher le boutton de reset jaxxdemo.numbereditor.useFloat=Utiliser les décimales jaxxdemo.numbereditor.useSign=Utiliser le signe jaxxdemo.openHelp=Open contextual help (%s), Will come in 3.0 version +jaxxdemo.timeeditor.configuration= +jaxxdemo.timeeditor.configuration.label= +jaxxdemo.timeeditor.configuration.label.value= jaxxdemo.timeeditor.editor=Editeur de temps +jaxxdemo.timeeditor.enable= jaxxdemo.timeeditor.label=Label jaxxdemo.timeeditor.model=Résultat +jaxxdemo.timeeditor.result= +jaxxdemo.timeeditor.result.time= jaxxdemo.title.about=A propos de JAXX Demo... jaxxdemo.title.showLog=Logs de JAXX Demo jaxxdemo.tree.tabtitle=Arbre 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 b554e86..8152812 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 @@ -264,10 +264,10 @@ jaxxdemo.datetimeeditor.configuration.format.value=dd-MM-yyyy jaxxdemo.datetimeeditor.configuration.label=Libellé de l'éditeur jaxxdemo.datetimeeditor.configuration.label.value=Date - Heure jaxxdemo.datetimeeditor.editor=Éditeur +jaxxdemo.datetimeeditor.enable=Activer / Désactiver jaxxdemo.datetimeeditor.result=Résultat jaxxdemo.datetimeeditor.result.date=Date \: jaxxdemo.datetimeeditor.result.dayDate=Jour \: -jaxxdemo.datetimeeditor.result.daydate= jaxxdemo.datetimeeditor.result.timeDate=Heure \: jaxxdemo.feature=Fonctionnalités jaxxdemo.feature.databinding=Data binding @@ -324,9 +324,15 @@ jaxxdemo.numbereditor.showReset=Afficher le boutton de reset jaxxdemo.numbereditor.useFloat=Utiliser les décimales jaxxdemo.numbereditor.useSign=Utiliser le signe jaxxdemo.openHelp=Ouvertude l'aide contextuelle (%s), A venir en version 3.0 +jaxxdemo.timeeditor.configuration=Configuration +jaxxdemo.timeeditor.configuration.label=Libellé de l'éditeur +jaxxdemo.timeeditor.configuration.label.value=Heure jaxxdemo.timeeditor.editor=Editeur de temps +jaxxdemo.timeeditor.enable=Activer / Désactiver jaxxdemo.timeeditor.label=Label jaxxdemo.timeeditor.model=Résultat +jaxxdemo.timeeditor.result=Résultat +jaxxdemo.timeeditor.result.time=Heure \: jaxxdemo.title.about=A propos de JAXX Demo... jaxxdemo.title.showLog=Logs de JAXX Demo jaxxdemo.tree.tabtitle=Arbre diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorHandler.java b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorHandler.java index 235ef0d..e97cd7f 100644 --- a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorHandler.java +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorHandler.java @@ -30,20 +30,12 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.widgets.MutateOnConditionalPropertyChangeListener; import org.nuiton.util.beans.BeanUtil; -import javax.swing.JLabel; import javax.swing.JSlider; import javax.swing.JSpinner; -import javax.swing.plaf.basic.BasicSliderUI; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; import java.lang.reflect.Method; import java.util.Calendar; import java.util.Date; -import java.util.Dictionary; import java.util.GregorianCalendar; -import java.util.Hashtable; -import java.util.Map; /** * Created on 9/9/14. @@ -74,102 +66,10 @@ public class DateTimeEditorHandler implements UIHandler<DateTimeEditor> { ui.getMinuteEditor().setEditor(new JSpinner.DateEditor(ui.getMinuteEditor(), "mm")); ui.getHourEditor().setEditor(new JSpinner.DateEditor(ui.getHourEditor(), "HH")); - // create slider labels - Map<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>(); - for (int i = 0; i < 25; i += 2) { - labelTable.put(i * 60, new JLabel(i + "")); - } JSlider slider = ui.getSlider(); - slider.setLabelTable((Dictionary<?, ?>) labelTable); - - MouseAdapter m = new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - // set the value - int value = getSliderValue(e); - JSlider slider = (JSlider) e.getComponent(); - slider.setValueIsAdjusting(true); - slider.setValue(value); - slider.setValueIsAdjusting(false); - showToolTip(e); - e.consume(); - } - - @Override - public void mouseDragged(MouseEvent e) { - showToolTip(e); - } - @Override - public void mouseEntered(MouseEvent e) { - showToolTip(e); - } - - @Override - public void mouseMoved(MouseEvent e) { - showToolTip(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - showToolTip(e); - } - - @Override - public void mouseWheelMoved(MouseWheelEvent e) { - JSlider slider = (JSlider) e.getComponent(); - - // compute new value - int nb = e.getWheelRotation(); - int value = slider.getValue() - nb; - - // set the value - slider.setValueIsAdjusting(true); - slider.setValue(value); - slider.setValueIsAdjusting(false); - e.consume(); - } - - int getSliderValue(MouseEvent e) { - JSlider slider = (JSlider) e.getSource(); - int value = -1; - if (slider.getUI() instanceof BasicSliderUI) { - BasicSliderUI ui = (BasicSliderUI) slider.getUI(); - value = slider.getOrientation() == JSlider.HORIZONTAL - ? ui.valueForXPosition(e.getX()) - : ui.valueForYPosition(e.getY()); - } - return value; - } - - void showToolTip(MouseEvent e) { - - int value = getSliderValue(e); - if (value == -1) { - return; - } - int h = value / 60; - int m = value % 60; - - String text = ""; - if (h < 10) { - text = "0"; - } - text += h + " : "; - if (m < 10) { - text += "0"; - } - text += m; - - JSlider source = (JSlider) e.getSource(); - source.setToolTipText(text); - - } - }; - slider.addMouseListener(m); - slider.addMouseMotionListener(m); - slider.addMouseWheelListener(m); + TimeSliderInitializer timeSliderInitializer = new TimeSliderInitializer(); + timeSliderInitializer.init(slider); } diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorModel.java b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorModel.java index 7e914b2..439bcee 100644 --- a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorModel.java +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/DateTimeEditorModel.java @@ -90,8 +90,6 @@ public class DateTimeEditorModel extends AbstractSerializableBean implements Mod protected final Calendar calendar = new GregorianCalendar(); - protected final Calendar calendarMinute = new GregorianCalendar(); - public String getPropertyDayDate() { return propertyDayDate; } diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditor.css b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditor.css new file mode 100644 index 0000000..7424960 --- /dev/null +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditor.css @@ -0,0 +1,74 @@ +/* + * #%L + * JAXX :: Widgets DateTime + * %% + * Copyright (C) 2008 - 2014 CodeLutin + * %% + * 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% + */ + +#title { + horizontalAlignment:center; +} + +#hourModel { + calendarField:{Calendar.HOUR_OF_DAY}; + value:{handler.getHourModelValue(model.getTime())}; +} + +#hourEditor { + model:{hourModel}; + enabled:{isEnabled()}; +} + +#labelH { + text:"timeeditor.H"; + horizontalAlignment:center; +} + +#minuteModel { + calendarField:{Calendar.MINUTE}; + value:{handler.getMinuteModelValue(model.getTime())}; +} + +#minuteEditor { + model:{minuteModel}; + enabled:{isEnabled()}; +} + +#sliderHidorToolBar { + borderPainted:false; + floatable:false; + opaque:false; +} + +#sliderHidor { + target:{slider}; + showTip:{t("timeeditor.show.slider")}; + hideTip:{t("timeeditor.hide.slider")}; + targetVisible:{isShowTimeEditorSlider()}; +} + +#slider { + font-size: 11; + paintTicks:true; + paintLabels:true; + majorTickSpacing:60; + minorTickSpacing:30; + value:{model.getTimeInMinutes()}; + enabled:{isEnabled()}; + model:{new DefaultBoundedRangeModel(0, 1, 0, 60 * 24)}; +} diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditor.jaxx b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditor.jaxx new file mode 100644 index 0000000..70cd67d --- /dev/null +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditor.jaxx @@ -0,0 +1,79 @@ +<!-- + #%L + JAXX :: Widgets DateTime + %% + Copyright (C) 2008 - 2014 CodeLutin + %% + 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()}'> + + <import> + java.util.Calendar + java.util.Date + java.io.Serializable + java.awt.BorderLayout + + jaxx.runtime.swing.HidorButton + javax.swing.DefaultBoundedRangeModel + </import> + + <!-- model --> + <TimeEditorModel id='model'/> + + <!-- spinner hour editor --> + <SpinnerDateModel id="hourModel"/> + + <!-- spinner minute editor --> + <SpinnerDateModel id="minuteModel"/> + + <!-- flag to show or hide the time slider (this state can be saved by SwingSession) --> + <Boolean id='showTimeEditorSlider' javaBean='true'/> + + <script><![CDATA[ +public void init() { handler.init(this); } + +public void setBean(Serializable bean) { model.setBean(bean); } +public void setPropertyTime(String property) { model.setPropertyTime(property); } +public void setTime(Date time) { model.setTime(time); } + +public void setLabel(String label) { timeLabel.setText(label); } +]]> + </script> + + <BeanValidator id='validator' autoField='true' bean='model'> + <field name='time' component='timeEditor'/> + </BeanValidator> + + <JPanel id='dateEditor' constraints='BorderLayout.NORTH' layout='{new BorderLayout()}'> + <JLabel id='timeLabel' constraints='BorderLayout.WEST'/> + <JPanel constraints='BorderLayout.EAST'> + <JPanel id='timeEditor'> + <JSpinner id='hourEditor' onStateChanged='handler.setHours((Date)((JSpinner)event.getSource()).getValue())'/> + <JLabel id='labelH'/> + <JSpinner id='minuteEditor' onStateChanged='handler.setMinutes((Date)((JSpinner)event.getSource()).getValue())'/> + </JPanel> + <JToolBar id="sliderHidorToolBar"> + <HidorButton id='sliderHidor'/> + </JToolBar> + </JPanel> + </JPanel> + + <JSlider id='slider' constraints='BorderLayout.SOUTH' + onStateChanged='if (!slider.getValueIsAdjusting()) model.setTimeInMinutes((Integer)((JSlider)event.getSource()).getValue());'/> + +</JPanel> diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditorHandler.java b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditorHandler.java new file mode 100644 index 0000000..bd206b9 --- /dev/null +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditorHandler.java @@ -0,0 +1,211 @@ +package org.nuiton.jaxx.widgets.datetime; + +import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import jaxx.runtime.spi.UIHandler; +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.JSlider; +import javax.swing.JSpinner; +import java.lang.reflect.Method; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * Created on 11/30/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.18 + */ +public class TimeEditorHandler implements UIHandler<TimeEditor> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(TimeEditorHandler.class); + + protected TimeEditor ui; + + @Override + public void beforeInit(TimeEditor ui) { + + TimeEditorModel model = new TimeEditorModel(); + ui.setContextValue(model); + + this.ui = ui; + + } + + @Override + public void afterInit(TimeEditor ui) { + + ui.getMinuteEditor().setEditor(new JSpinner.DateEditor(ui.getMinuteEditor(), "mm")); + ui.getHourEditor().setEditor(new JSpinner.DateEditor(ui.getHourEditor(), "HH")); + + JSlider slider = ui.getSlider(); + + TimeSliderInitializer timeSliderInitializer = new TimeSliderInitializer(); + timeSliderInitializer.init(slider); + + } + + public void init(TimeEditor ui) { + + TimeEditorModel model = ui.getModel(); + + Object bean = model.getBean(); + + if (bean != null) { + + Predicate<TimeEditorModel> predicate = model.canUpdateBeanValuePredicate(); + + if (model.getPropertyTime() != null) { + + Method mutator = BeanUtil.getMutator(bean, model.getPropertyTime()); + Preconditions.checkNotNull(mutator, "could not find mutator for " + model.getPropertyTime()); + + // When model time date changed, let's push it back in bean + model.addPropertyChangeListener( + TimeEditorModel.PROPERTY_TIME, + new MutateOnConditionalPropertyChangeListener<TimeEditorModel>(model, mutator, predicate)); + + } + + } + + } + + protected final Calendar calendarMinute = new GregorianCalendar(); + + protected final Calendar calendarHour = new GregorianCalendar(); + + public Date getMinuteModelValue(Date incomingDate) { + if (incomingDate == null) { + incomingDate = new Date(); + } + calendarMinute.setTime(incomingDate); + calendarMinute.set(Calendar.HOUR_OF_DAY, 0); + incomingDate = calendarMinute.getTime(); + return incomingDate; + } + + public Date getHourModelValue(Date incomingDate) { + if (incomingDate == null) { + incomingDate = new Date(); + } + calendarHour.setTime(incomingDate); + calendarHour.set(Calendar.MINUTE, 0); + incomingDate = calendarHour.getTime(); + return incomingDate; + } + + public void setHours(Date hourDate) { + + TimeEditorModel model = ui.getModel(); + + Date oldTime = model.getTime(); + + if (oldTime == null) { + return; + } + + calendarHour.setTime(hourDate); + int newHour = calendarHour.get(Calendar.HOUR_OF_DAY); + int newMinute = calendarHour.get(Calendar.MINUTE); + + int oldHour = model.getHour(oldTime); + int oldMinute = model.getMinute(oldTime); + + if (oldHour == newHour && oldMinute == newMinute) { + + // do nothing, same data + if (log.isDebugEnabled()) { + log.debug("Do not update time model , stay on same time = " + oldHour + ":" + oldMinute); + } + return; + } + + // by default stay on same hour + int hour = newHour; + + // by default, use the new minute data + int minute = oldMinute; + + if (log.isDebugEnabled()) { + log.debug("hh:mm (old from dateModel) = " + oldHour + ":" + oldMinute); + log.debug("hh:mm (new from hourModel) = " + newHour + ":" + newMinute); + } + + // change time + model.setTimeInMinutes(hour * 60 + minute); + + } + + public void setMinutes(Date minuteDate) { + + TimeEditorModel model = ui.getModel(); + + Date oldTime = model.getTime(); + + if (oldTime == null) { + return; + } + + calendarMinute.setTime(minuteDate); + int newHour = calendarMinute.get(Calendar.HOUR_OF_DAY); + int newMinute = calendarMinute.get(Calendar.MINUTE); + + int oldHour = model.getHour(oldTime); + int oldMinute = model.getMinute(oldTime); + + if (oldHour == newHour && oldMinute == newMinute) { + + // do nothing, same data + if (log.isDebugEnabled()) { + log.debug("Do not update time model , stay on same time = " + oldHour + ":" + oldMinute); + } + return; + } + + // by default stay on same hour + int hour = oldHour; + + // by default, use the new minute data + int minute = newMinute; + + if (log.isDebugEnabled()) { + log.debug("hh:mm (old from dateModel) = " + oldHour + ":" + oldMinute); + log.debug("hh:mm (new from minuteModel) = " + newHour + ":" + newMinute); + } + + if (newMinute == 0) { + + // minute pass to zero (check if a new hour is required) + if (newHour == 1) { + + hour = (oldHour + 1) % 24; + + } + } else if (newMinute == 59) { + + // minute pass to 59 (check if a new hour is required) + + if (newHour == 23) { + + // decrease hour + hour = (oldHour - 1) % 24; + + } + } + + // time has changed + if (log.isDebugEnabled()) { + log.debug("Update time model to hh:mm = " + hour + ":" + minute); + } + + model.setTimeInMinutes(hour * 60 + minute); + } + +} diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditorModel.java b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditorModel.java new file mode 100644 index 0000000..6c43776 --- /dev/null +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeEditorModel.java @@ -0,0 +1,223 @@ +package org.nuiton.jaxx.widgets.datetime; + +import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import org.jdesktop.beans.AbstractSerializableBean; +import org.nuiton.jaxx.widgets.ModelToBean; + +import java.io.Serializable; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * Created on 11/30/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.18 + */ +public class TimeEditorModel extends AbstractSerializableBean implements ModelToBean { + + private static final long serialVersionUID = 1L; + + public static final String PROPERTY_TIME = "time"; + + public static final String PROPERTY_TIME_IN_MINUTES = "timeInMinutes"; + + public static final String PROPERTY_VALUE_IS_ADJUSTING = "valueIsAdjusting"; + + /** + * Optional bean where to push back dates. + */ + protected Serializable bean; + + /** + * Optional bean property where to push back the time date. + */ + protected String propertyTime; + + /** + * Time + */ + protected Date time = new Date(); + + /** + * State to be able to custom the model. will be pass to {@code false} by the {@link DateTimeEditorHandler#init(DateTimeEditor)}. + */ + protected boolean fillState = true; + + /** + * To stop propagate events when we are doing some modifications on the model. + */ + protected boolean valueIsAdjusting; + + protected final Calendar calendar = new GregorianCalendar(); + + public String getPropertyTime() { + return propertyTime; + } + + public void setPropertyTime(String propertyTime) { + Preconditions.checkState(fillState, "cant change *propertyTimeDate* property once the fillState is off."); + this.propertyTime = propertyTime; + } + + @Override + public Serializable getBean() { + return bean; + } + + public void setBean(Serializable bean) { + Preconditions.checkState(fillState, "cant change *bean* property once the fillState is off."); + this.bean = bean; + } + + public boolean isValueIsAdjusting() { + return valueIsAdjusting; + } + + public void setValueIsAdjusting(boolean valueIsAdjusting) { + boolean oldValue = isValueIsAdjusting(); + this.valueIsAdjusting = valueIsAdjusting; + fireValueIsAdjusting(oldValue); + } + + public void setHour(Integer hour) { + + if (!isValueIsAdjusting() && time != null) { + + Integer minute = getMinute(time); + + setTime(hour, minute); + + } + + } + + public void setMinute(Integer minute) { + + if (!isValueIsAdjusting() && time != null) { + + Integer hour = getHour(time); + + setTime(hour, minute); + + } + + } + + public Integer getTimeInMinutes() { + + Integer result = 0; + + if (time != null) { + + int hour = getHour(time); + int minute = getMinute(time); + + result = hour * 60 + minute; + + } + + return result; + + } + + public void setTimeInMinutes(Integer time) { + + if (!isValueIsAdjusting() && time != null) { + + int hour = time / 60; + int minute = time % 60; + setTime(hour, minute); + + } + + } + + public Date getTime() { + return time == null ? null : time; + } + + public void setTime(Date time) { + + if (time != null) { + + Integer hour = getHour(time); + Integer minute = getMinute(time); + + setTime(hour, minute); + + } + } + + protected Integer getHour(Date date) { + + Integer hour = null; + if (date != null) { + calendar.setTime(date); + hour = calendar.get(Calendar.HOUR_OF_DAY); + } + return hour; + + } + + protected Integer getMinute(Date date) { + + Integer hour = null; + if (date != null) { + calendar.setTime(date); + hour = calendar.get(Calendar.MINUTE); + } + return hour; + + } + + protected void setTime(Integer hour, Integer minute) { + + Date oldTime = getTime(); + Integer oldTimeInMinutes = getTimeInMinutes(); + + setValueIsAdjusting(true); + + try { + + calendar.setTime(time); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + + Date newTime = calendar.getTime(); + this.time = newTime; + + } finally { + + setValueIsAdjusting(false); + + fireTime(oldTime); + fireTimeInMinutes(oldTimeInMinutes); + + } + + } + + protected void fireTime(Date oldTime) { + firePropertyChange(PROPERTY_TIME, oldTime, getTime()); + } + + protected void fireTimeInMinutes(Integer oldDate) { + firePropertyChange(PROPERTY_TIME_IN_MINUTES, oldDate, getTimeInMinutes()); + } + + protected void fireValueIsAdjusting(boolean oldValue) { + firePropertyChange(PROPERTY_VALUE_IS_ADJUSTING, oldValue, isValueIsAdjusting()); + } + + protected Predicate<TimeEditorModel> canUpdateBeanValuePredicate() { + return new Predicate<TimeEditorModel>() { + @Override + public boolean apply(TimeEditorModel input) { + return !isValueIsAdjusting(); + } + }; + } +} diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeSliderInitializer.java b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeSliderInitializer.java new file mode 100644 index 0000000..090e2fe --- /dev/null +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/TimeSliderInitializer.java @@ -0,0 +1,152 @@ +package org.nuiton.jaxx.widgets.datetime; + +import javax.swing.JLabel; +import javax.swing.JSlider; +import javax.swing.plaf.basic.BasicSliderUI; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Map; + +/** + * Created on 11/30/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.18 + */ +class TimeSliderInitializer { + + public void init(JSlider slider) { + + // create slider labels + Map<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>(); + for (int i = 0; i < 25; i += 2) { + labelTable.put(i * 60, new JLabel(i + "")); + } + slider.setLabelTable((Dictionary<?, ?>) labelTable); + + slider.addMouseListener(new MouseListener() { + + @Override + public void mouseClicked(MouseEvent e) { + + JSlider component = (JSlider) e.getComponent(); + + if (component.isEnabled()) { + + component.setValueIsAdjusting(true); + + try { + + int value = getSliderValue(e); + component.setValue(value); + + } finally { + component.setValueIsAdjusting(false); + } + + } + + showToolTip(e); + e.consume(); + + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + showToolTip(e); + } + + @Override + public void mouseEntered(MouseEvent e) { + showToolTip(e); + } + + @Override + public void mouseExited(MouseEvent e) { + + } + }); + slider.addMouseMotionListener(new MouseMotionListener() { + + @Override + public void mouseDragged(MouseEvent e) { + showToolTip(e); + } + + @Override + public void mouseMoved(MouseEvent e) { + showToolTip(e); + } + }); + slider.addMouseWheelListener(new MouseWheelListener() { + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + + JSlider component = (JSlider) e.getComponent(); + + if (component.isEnabled()) { + + // compute new value + int nb = e.getWheelRotation(); + int value = component.getValue() - nb; + + // set the value + component.setValueIsAdjusting(true); + try { + component.setValue(value); + } finally { + component.setValueIsAdjusting(false); + } + + } + e.consume(); + } + }); + } + + int getSliderValue(MouseEvent e) { + JSlider slider = (JSlider) e.getSource(); + int value = -1; + if (slider.getUI() instanceof BasicSliderUI) { + BasicSliderUI ui = (BasicSliderUI) slider.getUI(); + value = slider.getOrientation() == JSlider.HORIZONTAL + ? ui.valueForXPosition(e.getX()) + : ui.valueForYPosition(e.getY()); + } + return value; + } + + void showToolTip(MouseEvent e) { + + int value = getSliderValue(e); + if (value == -1) { + return; + } + int h = value / 60; + int m = value % 60; + + String text = ""; + if (h < 10) { + text = "0"; + } + text += h + " : "; + if (m < 10) { + text += "0"; + } + text += m; + + JSlider source = (JSlider) e.getSource(); + source.setToolTipText(text); + + } +} diff --git a/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/session/TimeEditorState.java b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/session/TimeEditorState.java new file mode 100644 index 0000000..74337f9 --- /dev/null +++ b/jaxx-widgets-datetime/src/main/java/org/nuiton/jaxx/widgets/datetime/session/TimeEditorState.java @@ -0,0 +1,54 @@ +package org.nuiton.jaxx.widgets.datetime.session; + +import jaxx.runtime.swing.session.State; +import org.nuiton.jaxx.widgets.datetime.TimeEditor; + +/** + * Created on 11/30/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.18 + */ +public class TimeEditorState implements State { + + protected Boolean showTimeEditorSlider = false; + + public boolean getShowTimeEditorSlider() { + return showTimeEditorSlider; + } + + public void setShowTimeEditorSlider(boolean showTimeEditorSlider) { + this.showTimeEditorSlider = showTimeEditorSlider; + } + + @Override + public State getState(Object o) { + TimeEditor list = checkComponent(o); + TimeEditorState state = new TimeEditorState(); + state.setShowTimeEditorSlider(list.getShowTimeEditorSlider()); + return state; + } + + @Override + public void setState(Object o, State state) { + if (!(state instanceof TimeEditorState)) { + throw new IllegalArgumentException("invalid state"); + } + + TimeEditor list = checkComponent(o); + TimeEditorState beanDoubleListState = (TimeEditorState) state; + list.setShowTimeEditorSlider(beanDoubleListState.getShowTimeEditorSlider()); + + } + + protected TimeEditor checkComponent(Object o) { + if (o == null) { + throw new IllegalArgumentException("null component"); + } + if (!(o instanceof TimeEditor)) { + throw new IllegalArgumentException("invalid component"); + } + return (TimeEditor) o; + } + +} diff --git a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_en_GB.properties b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_en_GB.properties index 35ea065..1d7d595 100644 --- a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_en_GB.properties +++ b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_en_GB.properties @@ -1,3 +1,6 @@ datetimeeditor.H=H datetimeeditor.hide.slider=hide time editor slider datetimeeditor.show.slider=show time editor slider +timeeditor.H=H +timeeditor.hide.slider=hide time editor slider +timeeditor.show.slider=show time editor slider diff --git a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_es_ES.properties b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_es_ES.properties index 35ea065..1d7d595 100644 --- a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_es_ES.properties +++ b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_es_ES.properties @@ -1,3 +1,6 @@ datetimeeditor.H=H datetimeeditor.hide.slider=hide time editor slider datetimeeditor.show.slider=show time editor slider +timeeditor.H=H +timeeditor.hide.slider=hide time editor slider +timeeditor.show.slider=show time editor slider diff --git a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_fr_FR.properties b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_fr_FR.properties index 53a7e65..31dcf61 100644 --- a/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_fr_FR.properties +++ b/jaxx-widgets-datetime/src/main/resources/i18n/jaxx-widgets-datetime_fr_FR.properties @@ -1,3 +1,6 @@ datetimeeditor.H=H datetimeeditor.hide.slider=Cacher la réglette d'édition des heures datetimeeditor.show.slider=Voir la réglette d'édition des heures +timeeditor.H=H +timeeditor.hide.slider=Cacher la réglette d'édition des heures +timeeditor.show.slider=Voir la réglette d'édition des heures -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
participants (1)
-
nuiton.org scm