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>.