Jaxx-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- 3898 discussions
r2063 - in trunk/jaxx-demo/src/main: filters java/jaxx/demo/component/jaxx java/jaxx/demo/component/jaxx/editor
by tchemit@users.nuiton.org 04 Sep '10
by tchemit@users.nuiton.org 04 Sep '10
04 Sep '10
Author: tchemit
Date: 2010-09-05 01:22:35 +0200 (Sun, 05 Sep 2010)
New Revision: 2063
Url: http://nuiton.org/repositories/revision/jaxx/2063
Log:
add headers + fix jaxx-demo site url
Modified:
trunk/jaxx-demo/src/main/filters/jaxx-demo.properties
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.css
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.css
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemoModel.java
Modified: trunk/jaxx-demo/src/main/filters/jaxx-demo.properties
===================================================================
--- trunk/jaxx-demo/src/main/filters/jaxx-demo.properties 2010-09-04 21:14:57 UTC (rev 2062)
+++ trunk/jaxx-demo/src/main/filters/jaxx-demo.properties 2010-09-04 23:22:35 UTC (rev 2063)
@@ -1,6 +1,6 @@
application.name=${project.name}
application.version=${project.version}
-application.site.url=http://maven-site.nuiton.org/jaxx/jaxx-example
+application.site.url=http://maven-site.nuiton.org/jaxx/jaxx-demo
application.icon.path=/icons/jaxx.png
application.license.path=META-INF/${project.artifactId}-LICENSE.txt
application.third-party.path=META-INF/${project.artifactId}-THIRD-PARTY.txt
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.css
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.css 2010-09-04 21:14:57 UTC (rev 2062)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.css 2010-09-04 23:22:35 UTC (rev 2063)
@@ -1,3 +1,27 @@
+/*
+ * #%L
+ * JAXX :: Demo
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2008 - 2010 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%
+ */
#layerUI {
blockIcon:{SwingUtil.createImageIcon("action-block.png")};
acceptIcon:{SwingUtil.createImageIcon("action-accept.png")};
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.css
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.css 2010-09-04 21:14:57 UTC (rev 2062)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.css 2010-09-04 23:22:35 UTC (rev 2063)
@@ -1,3 +1,27 @@
+/*
+ * #%L
+ * JAXX :: Demo
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2008 - 2010 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(_("jaxxdemo.numbereditor.configuration"))};
layout:{new GridLayout(0,1)};
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx 2010-09-04 21:14:57 UTC (rev 2062)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx 2010-09-04 23:22:35 UTC (rev 2063)
@@ -1,3 +1,27 @@
+<!--
+ #%L
+ JAXX :: Demo
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2008 - 2010 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%
+ -->
<jaxx.demo.DemoPanel layout='{new BorderLayout()}'>
<import>
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemoModel.java
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemoModel.java 2010-09-04 21:14:57 UTC (rev 2062)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemoModel.java 2010-09-04 23:22:35 UTC (rev 2063)
@@ -1,3 +1,27 @@
+/*
+ * #%L
+ * JAXX :: Demo
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2008 - 2010 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%
+ */
package jaxx.demo.component.jaxx.editor;
import jaxx.runtime.swing.editor.TimeEditor;
1
0
Author: tchemit
Date: 2010-09-04 23:14:57 +0200 (Sat, 04 Sep 2010)
New Revision: 2062
Url: http://nuiton.org/repositories/revision/jaxx/2062
Log:
add header
Modified:
trunk/src/site/rst/spec-validator2.rst
Modified: trunk/src/site/rst/spec-validator2.rst
===================================================================
--- trunk/src/site/rst/spec-validator2.rst 2010-09-04 21:14:18 UTC (rev 2061)
+++ trunk/src/site/rst/spec-validator2.rst 2010-09-04 21:14:57 UTC (rev 2062)
@@ -1,3 +1,27 @@
+.. -
+.. * #%L
+.. * JAXX
+.. *
+.. * $Id$
+.. * $HeadURL$
+.. * %%
+.. * Copyright (C) 2008 - 2010 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%
+.. -
=========================================================================
Amelioration de la gestion des validateurs dans les interfaces graphiques
=========================================================================
1
0
r2061 - in trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing: . editor/bean
by tchemit@users.nuiton.org 04 Sep '10
by tchemit@users.nuiton.org 04 Sep '10
04 Sep '10
Author: tchemit
Date: 2010-09-04 23:14:18 +0200 (Sat, 04 Sep 2010)
New Revision: 2061
Url: http://nuiton.org/repositories/revision/jaxx/2061
Log:
Evolution #848: Introduce jaxx.runtime.swing.editor.bean package
Evolution #849: Deprecates EntityComboBox, use now BeanComboBox
Added:
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBox.jaxx
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java
Modified:
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBox.jaxx
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBoxHandler.java
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBox.jaxx
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBox.jaxx 2010-09-04 21:00:33 UTC (rev 2060)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBox.jaxx 2010-09-04 21:14:18 UTC (rev 2061)
@@ -21,6 +21,8 @@
License along with this program. If not, see
<http://www.gnu.org/licenses/lgpl-3.0.html>.
#L%
+
+ @deprecated since 2.2, use now {@link BeanComboBox}
-->
<Table fill='both' insets='0' genericType='O'
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBoxHandler.java
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBoxHandler.java 2010-09-04 21:00:33 UTC (rev 2060)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/EntityComboBoxHandler.java 2010-09-04 21:14:18 UTC (rev 2061)
@@ -27,6 +27,7 @@
import java.awt.Component;
import jaxx.runtime.SwingUtil;
+import jaxx.runtime.swing.editor.bean.BeanComboBoxHandler;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -68,7 +69,9 @@
*
* @author tchemit <chemit(a)codelutin.com>
* @see EntityComboBox
+ * @deprecated since 2.2, use now {@link BeanComboBoxHandler}.
*/
+@Deprecated
public class EntityComboBoxHandler<O> implements PropertyChangeListener {
public static final Log log = LogFactory.getLog(EntityComboBoxHandler.class);
Added: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBox.jaxx
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBox.jaxx (rev 0)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBox.jaxx 2010-09-04 21:14:18 UTC (rev 2061)
@@ -0,0 +1,137 @@
+<!--
+ #%L
+ JAXX :: Widgets
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2008 - 2010 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%
+ -->
+
+<Table fill='both' insets='0' genericType='O'
+ onFocusGained='combobox.requestFocus()'
+ onFocusLost='hidePopup()'>
+
+ <!-- auto complete property -->
+ <Boolean id='autoComplete' javaBean='false'/>
+
+ <!-- show reset property -->
+ <Boolean id='showReset' javaBean='false'/>
+
+ <!-- show decorator property -->
+ <Boolean id='showDecorator' javaBean='true'/>
+
+ <!-- editable combo property -->
+ <Boolean id='editable' javaBean='true'/>
+
+ <!-- bean property linked state -->
+ <String id='property' javaBean='""'/>
+
+ <!-- bean property -->
+ <Object id='bean' javaBean='null'/>
+
+ <!-- selectedItem property -->
+ <Object id='selectedItem' javaBean='null'/>
+
+ <!-- sort index property -->
+ <Integer id='index' javaBean='0'/>
+
+ <!-- datas of the combo-box -->
+ <java.util.List id='data' genericType='O' javaBean='null'/>
+
+ <!-- model of sorted property -->
+ <ButtonGroup id='indexes' useToolTipText='true'
+ onStateChanged='setIndex((Integer)indexes.getSelectedValue())'/>
+
+ <!-- ui handler -->
+ <BeanComboBoxHandler id='handler' genericType='O' constructorParams='this'/>
+
+ <String id='selectedToolTipText' javaBean='null'/>
+
+ <String id='notSelectedToolTipText' javaBean='null'/>
+
+ <String id='popupTitleText' javaBean='null'/>
+
+ <String id='i18nPrefix' javaBean='"entitycombobox.common."'/>
+
+ <!-- popup to change sorted property-->
+ <JPopupMenu id='popup'
+ border='{new TitledBorder(_("entitycombobox.popup.title"))}'
+ onPopupMenuWillBecomeInvisible='getChangeDecorator().setSelected(false)'
+ onPopupMenuCanceled='getChangeDecorator().setSelected(false)'>
+ <JLabel id='popupLabel'/>
+ <JSeparator/>
+ </JPopupMenu>
+
+ <script><![CDATA[
+import static org.nuiton.i18n.I18n.n_;
+import jaxx.runtime.decorator.JXPathDecorator;
+
+public static final String DEFAULT_POPUP_LABEL = n_("entitycombobox.popup.label");
+
+public static final String DEFAULT_SELECTED_TOOLTIP = n_("entitycombobox.sort.on");
+
+public static final String DEFAULT_NOT_SELECTED_TOOLTIP = n_("entitycombobox.sort.off");
+
+public void init(JXPathDecorator<O> decorator, java.util.List<O> data) {
+ handler.init(decorator, data);
+}
+
+protected void hidePopup() {
+ if (popup.isVisible()) {
+ popup.setVisible(false);
+ }
+}
+]]>
+ </script>
+ <row>
+ <cell anchor='west'>
+ <!-- le boutton pour reinitialiser la valeur sélectionnée -->
+ <JToolBar floatable='false' borderPainted='false' visible='{isShowReset()}'>
+ <JButton actionIcon='combobox-reset'
+ toolTipText='entitycombobox.action.reset.tip'
+ focusable='false'
+ focusPainted='false'
+ enabled='{isEditable() && isEnabled()}'
+ onActionPerformed='setSelectedItem(null)'/>
+ </JToolBar>
+
+ </cell>
+ <cell weightx='1'>
+ <!-- la liste déroulante -->
+ <JComboBox id='combobox'
+ selectedItem='{getSelectedItem()}'
+ enabled='{isEnabled()}'
+ editable='{isEditable()}'
+ focusable='{isEnabled() && isEditable()}'
+ onFocusGained='hidePopup()'
+ onItemStateChanged='setSelectedItem(combobox.getSelectedItem())'/>
+ </cell>
+ <cell anchor='east' fill='both' insets='0'>
+ <!-- le boutton pour changer le tri -->
+ <JToolBar floatable='false' borderPainted='false' visible='{isShowDecorator()}'>
+ <JToggleButton id='changeDecorator'
+ actionIcon='combobox-sort'
+ toolTipText='entitycombobox.action.sort.tip'
+ focusable='false'
+ focusPainted='false'
+ onActionPerformed='getHandler().togglePopup()'/>
+ </JToolBar>
+ </cell>
+ </row>
+</Table>
Added: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java (rev 0)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java 2010-09-04 21:14:18 UTC (rev 2061)
@@ -0,0 +1,491 @@
+/*
+ * #%L
+ * JAXX :: Widgets
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2008 - 2010 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%
+ */
+
+package jaxx.runtime.swing.editor.bean;
+
+import jaxx.runtime.SwingUtil;
+import jaxx.runtime.decorator.Decorator;
+import jaxx.runtime.decorator.DecoratorUtils;
+import jaxx.runtime.decorator.JXPathDecorator;
+import jaxx.runtime.decorator.MultiJXPathDecorator;
+import jaxx.runtime.swing.JAXXButtonGroup;
+import jaxx.runtime.swing.renderer.DecoratorListCellRenderer;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;
+import org.jdesktop.swingx.autocomplete.AutoCompletePropertyChangeListener;
+import org.jdesktop.swingx.autocomplete.ObjectToStringConverter;
+
+import javax.swing.JComboBox;
+import javax.swing.JPopupMenu;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.JToggleButton;
+import javax.swing.SwingUtilities;
+import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.beans.Introspector;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import static org.nuiton.i18n.I18n._;
+import static org.nuiton.i18n.I18n.n_;
+
+/**
+ * Le handler d'un {@link BeanComboBox}.
+ * <p/>
+ * Note: ce handler n'est pas staeless et n'est donc pas partageable entre plusieurs ui.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @param <O> le type des objet contenus dans le modèle du composant.
+ * @see BeanComboBox
+ */
+public class BeanComboBoxHandler<O> implements PropertyChangeListener {
+
+ public static final Log log = LogFactory.getLog(BeanComboBoxHandler.class);
+
+ public static final String SELECTED_ITEM_PROPERTY = "selectedItem";
+
+ public static final String INDEX_PROPERTY = "index";
+
+ public static final String AUTO_COMPLETE_PROPERTY = "autoComplete";
+
+ public static final String DATA_PROPERTY = "data";
+
+ /** ui if the handler */
+ protected BeanComboBox<O> ui;
+
+ /** the mutator method on the property of boxed bean in the ui */
+ protected Method mutator;
+
+ /** the original document of the combbo box editor (keep it to make possible undecorate) */
+ protected Document originalDocument;
+
+ /** the convertor used to auto-complete */
+ protected ObjectToStringConverter convertor;
+
+ /** the decorator of data */
+ protected MultiJXPathDecorator<O> decorator;
+
+ protected boolean init;
+
+ public BeanComboBoxHandler(BeanComboBox<O> ui) {
+ this.ui = ui;
+ }
+
+ protected final FocusListener EDITOR_TEXT_COMP0NENT_FOCUSLISTENER = new FocusListener() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ if (log.isDebugEnabled()) {
+ log.debug("close popup from " + e);
+ }
+ ui.getPopup().setVisible(false);
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ }
+ };
+
+ /**
+ * Initialise le handler de l'ui
+ *
+ * @param decorator le decorateur a utiliser
+ * @param data la liste des données a gérer
+ */
+ public void init(JXPathDecorator<O> decorator, List<O> data) {
+
+ if (init) {
+ throw new IllegalStateException("can not init the handler twice");
+ }
+ init = true;
+ if (decorator == null) {
+ throw new NullPointerException("can not have a null decorator as parameter");
+ }
+
+ JAXXButtonGroup indexes = ui.getIndexes();
+
+ MultiJXPathDecorator<O> d;
+ if (decorator instanceof MultiJXPathDecorator<?>) {
+ // should clone decorator ?
+ d = (MultiJXPathDecorator<O>) decorator;
+ } else {
+ d = DecoratorUtils.newMultiJXPathDecorator(decorator.getInternalClass(), decorator.getInitialExpression(), " - ");
+ }
+ this.decorator = d;
+
+ // init combobox renderer base on given decorator
+ ui.getCombobox().setRenderer(new DecoratorListCellRenderer(d));
+
+ convertor = newDecoratedObjectToStringConverter(d);
+
+ // keep a trace of original document (to make possible reverse autom-complete)
+ JTextComponent editorComponent = (JTextComponent) ui.getCombobox().getEditor().getEditorComponent();
+ originalDocument = editorComponent.getDocument();
+
+ // build popup
+ preparePopup(d);
+
+ ui.autoComplete = true;
+
+ ui.addPropertyChangeListener(this);
+
+ // set datas
+ ui.setData(data);
+
+ // select sort button
+ indexes.setSelectedButton(ui.getIndex());
+ }
+
+ /** Toggle the popup visible state. */
+ public void togglePopup() {
+ boolean newValue = !ui.getPopup().isVisible();
+
+ if (log.isTraceEnabled()) {
+ log.trace(newValue);
+ }
+
+ if (!newValue) {
+ if (ui.getPopup() != null) {
+ ui.getPopup().setVisible(false);
+ }
+ return;
+ }
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+ ui.getPopup().pack();
+ Dimension dim = ui.getPopup().getPreferredSize();
+ JToggleButton invoker = ui.getChangeDecorator();
+ ui.getPopup().show(invoker, (int) (invoker.getPreferredSize().getWidth() - dim.getWidth()), invoker.getHeight());
+ }
+ });
+ }
+
+ /**
+ * Modifie l'état autoComplete de l'ui.
+ *
+ * @param oldValue l'ancienne valeur
+ * @param newValue la nouvelle valeur
+ */
+ protected void setAutoComplete(Boolean oldValue, Boolean newValue) {
+ oldValue = oldValue != null && oldValue;
+ newValue = newValue != null && newValue;
+ if (oldValue == newValue) {
+ return;
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("autocomplete state : <" + oldValue + " to " + newValue + ">");
+ }
+ if (!newValue) {
+ JTextComponent editorComponent = (JTextComponent) ui.getCombobox().getEditor().getEditorComponent();
+ editorComponent.removeFocusListener(EDITOR_TEXT_COMP0NENT_FOCUSLISTENER);
+ undecorate(ui.getCombobox(), originalDocument);
+ } else {
+ decorate(ui.getCombobox(), convertor);
+ JTextComponent editorComponent = (JTextComponent) ui.getCombobox().getEditor().getEditorComponent();
+ editorComponent.addFocusListener(EDITOR_TEXT_COMP0NENT_FOCUSLISTENER);
+ }
+ }
+
+ /**
+ * Modifie l'index du décorateur
+ *
+ * @param oldValue l'ancienne valeur
+ * @param newValue la nouvelle valeur
+ */
+ @SuppressWarnings({"unchecked"})
+ protected void setIndex(Integer oldValue, Integer newValue) {
+ if (newValue.equals(oldValue)) {
+ return;
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("check state : <" + oldValue + " to " + newValue + ">");
+ }
+
+ // change decorator context
+ decorator.setContextIndex(newValue);
+
+ // keep selected item
+ Object previousSelectedItem = ui.getSelectedItem();
+ Boolean wasAutoComplete = ui.isAutoComplete();
+
+ if (wasAutoComplete) {
+ ui.setAutoComplete(false);
+ }
+
+ // remove autocomplete
+ if (previousSelectedItem != null) {
+ ui.getCombobox().setSelectedItem(null);
+ ui.selectedItem = null;
+ }
+
+
+ try {
+ // Sort data with the decorator jxpath tokens.
+ DecoratorUtils.sort(decorator, ui.getData(), newValue);
+ } catch (Exception e) {
+ log.warn(e.getMessage(), e);
+ //System.out.println("newValue :: "+decorator+" : "+newValue);
+ //System.out.println("datas :: "+ui.getData());
+ }
+
+ // reload the model
+ SwingUtil.fillComboBox(ui.getCombobox(), ui.getData(), null);
+
+ if (wasAutoComplete) {
+ ui.setAutoComplete(true);
+ }
+
+ if (previousSelectedItem != null) {
+ ui.setSelectedItem(previousSelectedItem);
+ }
+
+ ui.getCombobox().requestFocus();
+ }
+
+ /**
+ * Modifie la valeur sélectionnée dans la liste déroulante.
+ *
+ * @param oldValue l'ancienne valeur
+ * @param newValue la nouvelle valeur
+ */
+ protected void setSelectedItem(Object oldValue, Object newValue) {
+ if (ui.getBean() == null) {
+ return;
+ }
+
+ if (newValue == null) {
+ if (ui.getCombobox().getSelectedItem() == null) {
+ return;
+ }
+ ui.getCombobox().setSelectedItem(null);
+
+ if (ui.isAutoComplete()) {
+ ui.setAutoComplete(false);
+ ui.setAutoComplete(true);
+ }
+
+ if (oldValue == null) {
+ return;
+ }
+ }
+ if (log.isDebugEnabled()) {
+ log.debug(ui.getProperty() + " on " + ui.getBean().getClass() + " :: " + oldValue + " to " + newValue);
+ }
+
+ try {
+ Method mut = getMutator();
+ if (mut != null) {
+ mut.invoke(ui.getBean(), newValue);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /** @return le document de l'éditeur avant complétion. */
+ public Document getOriginalDocument() {
+ return originalDocument;
+ }
+
+ public MultiJXPathDecorator<O> getDecorator() {
+ return decorator;
+ }
+
+ /**
+ * Creation de l'ui pour modifier le décorateur.
+ *
+ * @param decorator le decorateur a utiliser
+ */
+ protected void preparePopup(MultiJXPathDecorator<?> decorator) {
+ String selectedTip = ui.getSelectedToolTipText();
+ if (selectedTip == null) {
+ // use default selected tip text
+ selectedTip = BeanComboBox.DEFAULT_SELECTED_TOOLTIP;
+ }
+ String notSelectedTip = ui.getNotSelectedToolTipText();
+ if (notSelectedTip == null) {
+ // use default selected tip text
+ notSelectedTip = BeanComboBox.DEFAULT_NOT_SELECTED_TOOLTIP;
+ }
+ JPopupMenu popup = ui.getPopup();
+
+ //Container container = ui.getIndexesContainer();
+ for (int i = 0, max = decorator.getNbContext(); i < max; i++) {
+ String property = ui.getI18nPrefix() + decorator.getProperty(i);
+ String propertyI18n = _(property);
+ JRadioButtonMenuItem button = new JRadioButtonMenuItem(propertyI18n);
+ button.putClientProperty(JAXXButtonGroup.BUTTON8GROUP_CLIENT_PROPERTY, ui.getIndexes());
+ button.putClientProperty(JAXXButtonGroup.VALUE_CLIENT_PROPERTY, i);
+ popup.add(button);
+ if (selectedTip != null) {
+ button.putClientProperty(JAXXButtonGroup.SELECTED_TIP_CLIENT_PROPERTY, _(selectedTip, propertyI18n));
+ }
+ if (notSelectedTip != null) {
+ button.putClientProperty(JAXXButtonGroup.NOT_SELECTED_TIP_CLIENT_PROPERTY, _(notSelectedTip, propertyI18n));
+ }
+ button.setSelected(false);
+ ui.getIndexes().add(button);
+ }
+ String title = ui.getPopupTitleText();
+ if (title == null) {
+ // use default popup title
+ title = BeanComboBox.DEFAULT_POPUP_LABEL;
+
+ Class<?> internalClass = decorator.getInternalClass();
+ String beanI18nKey;
+ if (internalClass == null) {
+ beanI18nKey = n_("entitycombobox.unknown.type");
+ } else {
+ beanI18nKey = ui.getI18nPrefix() + Introspector.decapitalize(internalClass.getSimpleName());
+ }
+ String beanI18n = _(beanI18nKey);
+ title = _(title, beanI18n);
+ } else {
+ title = _(title);
+ }
+ ui.getPopupLabel().setText(title);
+ ui.getPopup().setLabel(title);
+ ui.getPopup().invalidate();
+ }
+
+ public Class<?> getTargetClass() {
+ Method m = getMutator();
+ return m == null ? null : m.getParameterTypes()[0];
+ }
+
+ /** @return le mutateur a utiliser pour modifier le bean associé. */
+ protected Method getMutator() {
+ if (mutator == null) {
+ Object bean = ui.getBean();
+ if (bean == null) {
+ throw new NullPointerException("could not find bean in " + ui);
+ }
+ String property = ui.getProperty();
+ if (property == null) {
+ throw new NullPointerException("could not find property in " + ui);
+ }
+
+ try {
+ PropertyDescriptor descriptor = PropertyUtils.getPropertyDescriptor(bean, property);
+ if (descriptor != null) {
+ mutator = descriptor.getWriteMethod();
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return mutator;
+ }
+
+ /**
+ * Encapsule un {@link Decorator} dans un {@link ObjectToStringConverter}.
+ *
+ * @param decorator le decorateur a encapsuler.
+ * @return le converter encapsule dans un {@link ObjectToStringConverter}
+ */
+ public static ObjectToStringConverter newDecoratedObjectToStringConverter(final Decorator<?> decorator) {
+
+ return new ObjectToStringConverter() {
+
+ @Override
+ public String getPreferredStringForItem(Object item) {
+ return item instanceof String ? (String) item : item == null ? "" : decorator.toString(item);
+ }
+ };
+ }
+
+ /**
+ * Ajout l'auto-complétion sur une liste déroulante, en utilisant le
+ * converteur donné pour afficher les données.
+ *
+ * @param combo la combo à décorer
+ * @param convertor le converter utilisé pour afficher les données.
+ */
+ public static void decorate(JComboBox combo, ObjectToStringConverter convertor) {
+
+ AutoCompleteDecorator.decorate(combo, convertor);
+ }
+
+ /**
+ * Désactive l'aut-complétion sur une liste déroulante, en y repositionnant
+ * le modèle du document d'édition d'avant auto-complétion.
+ *
+ * @param combo la liste déroulante à décorer
+ * @param originalDocument le document original de l'édtieur de la
+ * liste déroulante.
+ */
+ public static void undecorate(JComboBox combo, Document originalDocument) {
+
+ // has not to be editable
+ combo.setEditable(false);
+
+ // configure the text component=editor component
+ Component c = combo.getEditor().getEditorComponent();
+ JTextComponent editorComponent = (JTextComponent) c;
+ editorComponent.setDocument(originalDocument);
+ editorComponent.setText(null);
+ //remove old property change listener
+ for (PropertyChangeListener l : c.getPropertyChangeListeners("editor")) {
+ if (l instanceof AutoCompletePropertyChangeListener) {
+ c.removePropertyChangeListener("editor", l);
+ }
+ }
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String propertyName = evt.getPropertyName();
+
+ if (SELECTED_ITEM_PROPERTY.equals(propertyName)) {
+ setSelectedItem(evt.getOldValue(), evt.getNewValue());
+ return;
+ }
+
+ if (INDEX_PROPERTY.equals(propertyName)) {
+ setIndex((Integer) evt.getOldValue(), (Integer) evt.getNewValue());
+ return;
+ }
+ if (AUTO_COMPLETE_PROPERTY.equals(propertyName)) {
+ setAutoComplete((Boolean) evt.getOldValue(), (Boolean) evt.getNewValue());
+ return;
+ }
+ if (DATA_PROPERTY.equals(propertyName)) {
+ // list has changed, force reload of index
+ setIndex(-1, ui.getIndex());
+ }
+
+ }
+}
1
0
r2060 - trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor
by tchemit@users.nuiton.org 04 Sep '10
by tchemit@users.nuiton.org 04 Sep '10
04 Sep '10
Author: tchemit
Date: 2010-09-04 23:00:33 +0200 (Sat, 04 Sep 2010)
New Revision: 2060
Url: http://nuiton.org/repositories/revision/jaxx/2060
Log:
Evolution #848: Introduce jaxx.runtime.swing.editor.bean package
Added:
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/
1
0
r2059 - trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor
by tchemit@users.nuiton.org 04 Sep '10
by tchemit@users.nuiton.org 04 Sep '10
04 Sep '10
Author: tchemit
Date: 2010-09-04 23:00:14 +0200 (Sat, 04 Sep 2010)
New Revision: 2059
Url: http://nuiton.org/repositories/revision/jaxx/2059
Log:
optimize imports
Modified:
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java 2010-09-04 20:13:40 UTC (rev 2058)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java 2010-09-04 21:00:14 UTC (rev 2059)
@@ -32,7 +32,6 @@
import javax.swing.JComponent;
import javax.swing.JTextField;
-import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import java.awt.Dimension;
1
0
r2058 - in trunk/jaxx-demo/src/main: java/jaxx/demo java/jaxx/demo/component/jaxx java/jaxx/demo/component/jaxx/editor java/jaxx/demo/tree resources resources/i18n
by tchemit@users.nuiton.org 04 Sep '10
by tchemit@users.nuiton.org 04 Sep '10
04 Sep '10
Author: tchemit
Date: 2010-09-04 22:13:40 +0200 (Sat, 04 Sep 2010)
New Revision: 2058
Url: http://nuiton.org/repositories/revision/jaxx/2058
Log:
Evolution #846: Improve jaxx demo
Added:
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.css
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.css
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemoModel.java
Modified:
trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.css
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.jaxx
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/I18nEditorDemo.jaxx
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditorDemo.jaxx
trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditorDemoModel.java
trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java
trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo-en_GB.properties
trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo-fr_FR.properties
trunk/jaxx-demo/src/main/resources/log4j.properties
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.css
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.css 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/DemoUI.css 2010-09-04 20:13:40 UTC (rev 2058)
@@ -56,7 +56,6 @@
toolTipText:"jaxxdemo.action.configuration.tip";
actionIcon:"config";
mnemonic:C;
- /*enabled:false;*/
_help:{"ui.main.menu.file.configuration"};
}
Added: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.css
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.css (rev 0)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.css 2010-09-04 20:13:40 UTC (rev 2058)
@@ -0,0 +1,39 @@
+#layerUI {
+ blockIcon:{SwingUtil.createImageIcon("action-block.png")};
+ acceptIcon:{SwingUtil.createImageIcon("action-accept.png")};
+ useIcon:true;
+ blockingColor:{new Color(50,50,50)};
+}
+
+#layerUI2 {
+ blockIcon:{SwingUtil.createImageIcon("action-block.png")};
+ acceptIcon:{SwingUtil.createImageIcon("action-accept.png")};
+}
+
+#buttonPane {
+ layout:{new GridLayout(0,2)};
+}
+
+#buttonA {
+ text:"button A";
+ _clickedText:{"button A was clicked"};
+}
+
+#buttonB {
+ text:"button B";
+ _clickedText:{"button B was clicked"};
+}
+
+#buttonC {
+ text:"button C (full block)";
+ _clickedText:{"button C was clicked"};
+}
+
+#buttonD {
+ text:"button D (full block 2)";
+ _clickedText:{"button D was clicked"};
+}
+
+#messages {
+ model:{new DefaultListModel()};
+}
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.jaxx
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.jaxx 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/BoxedDecoratorDemo.jaxx 2010-09-04 20:13:40 UTC (rev 2058)
@@ -24,22 +24,23 @@
-->
-<jaxx.demo.DemoPanel>
- <jaxx.runtime.swing.BlockingLayerUI id='layerUI'
- blockIcon='{SwingUtil.createImageIcon("action-block.png")}'
- acceptIcon='{SwingUtil.createImageIcon("action-accept.png")}'
- useIcon='true'
- blockingColor='{new Color(50,50,50)}'
- acceptAction='{new AbstractAction() { private static final long serialVersionUID = 1L;
+<jaxx.demo.DemoPanel layout='{new BorderLayout()}'>
+
+ <import>
+ jaxx.runtime.swing.BlockingLayerUI
+ jaxx.runtime.swing.BlockingLayerUI2
+ </import>
+ <BlockingLayerUI id='layerUI'
+ acceptAction='{new AbstractAction() {
+ private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
accept(e, "from icon of layer");
}
}}'/>
- <jaxx.runtime.swing.BlockingLayerUI2 id='layerUI2'
- blockIcon='{SwingUtil.createImageIcon("action-block.png")}'
- acceptIcon='{SwingUtil.createImageIcon("action-accept.png")}'
- acceptAction='{new AbstractAction() { private static final long serialVersionUID = 1L;
+ <BlockingLayerUI2 id='layerUI2'
+ acceptAction='{new AbstractAction() {
+ private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
accept(e, "from icon of layer");
@@ -47,15 +48,21 @@
}}'/>
<script><![CDATA[
+
+@Override
+protected String[] getSources() {
+ return new String[]{ getDefaultSource(), "BoxedDecoratorDemo.css" };
+}
+
void $afterCompleteSetup() {
for (JComponent boxed : SwingUtil.getLayeredComponents(this)) {
- if (boxed == d) {
+ if (boxed == buttonD) {
SwingUtil.getLayer(boxed).setUI(layerUI2);
continue;
}
- jaxx.runtime.swing.BlockingLayerUI ui = layerUI.clone();
- if ( boxed == c) {
+ BlockingLayerUI ui = layerUI.clone();
+ if (boxed == buttonC) {
ui.setBlock(true);
}
SwingUtil.getLayer(boxed).setUI(ui);
@@ -64,11 +71,11 @@
public void setLayer(boolean active) {
for (JComponent boxed : SwingUtil.getLayeredComponents(this)) {
- if (boxed == d) {
+ if (boxed == buttonD) {
continue;
}
- jaxx.runtime.swing.BlockingLayerUI ui = (jaxx.runtime.swing.BlockingLayerUI)SwingUtil.getLayer(boxed).getUI();
- if ( boxed == c) {
+ BlockingLayerUI ui = (BlockingLayerUI)SwingUtil.getLayer(boxed).getUI();
+ if (boxed == buttonC) {
ui.setBlock(active);
}
ui.setUseIcon(active);
@@ -82,7 +89,7 @@
((DefaultListModel)messages.getModel()).addElement(msg);
}]]>
</script>
- <Table fill='both' weightx='1'>
+ <Table fill='both' weightx='1' constraints='BorderLayout.CENTER'>
<row>
<cell>
<JCheckBox id='toggle' selected='true'
@@ -92,18 +99,15 @@
</row>
<row>
<cell weighty='0.5'>
- <JPanel layout='{new GridLayout(1,3,3,3)}'>
- <JButton text='button A' decorator='boxed'
+ <JPanel id='buttonPane'>
+ <JButton id='buttonA' decorator='boxed'
_clickedText='"button A was clicked"'
onActionPerformed='accept(event, "from button (no layer)")'/>
- <JButton text='button B' decorator='boxed'
- _clickedText='"button B was clicked"'
+ <JButton id='buttonB' decorator='boxed'
onActionPerformed='accept(event, "from button (no layer)")'/>
- <JButton id='c' text='button C (full block)' decorator='boxed'
- _clickedText='"button C was clicked"'
+ <JButton id='buttonC' decorator='boxed'
onActionPerformed='accept(event, "from button (no layer)");'/>
- <JButton id='d' text='button D (full block 2)' decorator='boxed'
- _clickedText='"button D was clicked"'
+ <JButton id='buttonD' decorator='boxed'
onActionPerformed='accept(event, "from button (no layer)");'/>
</JPanel>
</cell>
@@ -111,7 +115,7 @@
<row>
<cell weighty='0.5'>
<JScrollPane>
- <JList id='messages' model='{new DefaultListModel()}'/>
+ <JList id='messages'/>
</JScrollPane>
</cell>
</row>
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/I18nEditorDemo.jaxx
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/I18nEditorDemo.jaxx 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/I18nEditorDemo.jaxx 2010-09-04 20:13:40 UTC (rev 2058)
@@ -25,11 +25,12 @@
<jaxx.demo.DemoPanel>
+ <import>
+ jaxx.runtime.swing.editor.I18nEditor
+ org.nuiton.i18n.I18n
+ java.util.Arrays
+ </import>
<script><![CDATA[
-import jaxx.runtime.swing.editor.I18nEditor;
-import org.nuiton.i18n.I18n;
-import java.util.Arrays;
-
protected Border getPopupBorder(String text) {
if (text==null || text.trim().isEmpty()) {
return null;
@@ -65,7 +66,7 @@
<JLabel text='jaxxdemo.i18neditor.popupBorderText'
labelFor='{popupBorderText}'/>
<JTextField id='popupBorderText'
- text='{_("i18neditor.popup.title")}'/>
+ text='{_("jaxxdemo.i18neditor.popup.title")}'/>
</JPanel>
</JPanel>
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditorDemo.jaxx
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditorDemo.jaxx 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditorDemo.jaxx 2010-09-04 20:13:40 UTC (rev 2058)
@@ -23,21 +23,29 @@
#L%
-->
+<jaxx.demo.DemoPanel layout='{new BorderLayout()}'>
-<jaxx.demo.DemoPanel>
+ <import>
+ jaxx.runtime.swing.editor.NumberEditor
+ </import>
+
+ <!-- model -->
+ <NumberEditorDemoModel id='demoModel'/>
+
<script><![CDATA[
-import jaxx.runtime.swing.editor.NumberEditor;
+@Override
+protected String[] getSources() {
+ return new String[]{ getDefaultSource(), "NumberEditorDemoModel.java" };
+}
+
void $afterCompleteSetup() {
editor.init();
}
]]>
</script>
- <!-- model -->
- <NumberEditorDemoModel id='demoModel'/>
-
- <Table insets='0' fill='both'>
+ <Table insets='0' fill='both' weightx='1' constraints='BorderLayout.NORTH'>
<row>
<cell>
<JPanel
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditorDemoModel.java
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditorDemoModel.java 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/NumberEditorDemoModel.java 2010-09-04 20:13:40 UTC (rev 2058)
@@ -44,11 +44,6 @@
protected float floatProperty;
-// protected int positifInteger;
-// protected int normalInteger;
-// protected float positifFloat;
-// protected float normalFloat;
-
public NumberEditorDemoModel() {
p = new PropertyChangeSupport(this);
}
@@ -73,47 +68,6 @@
p.firePropertyChange(INTEGER_PROPERTY, old, integerProperty);
}
-//
-// public float getNormalFloat() {
-// return normalFloat;
-// }
-//
-// public int getNormalInteger() {
-// return normalInteger;
-// }
-//
-// public float getPositifFloat() {
-// return positifFloat;
-// }
-//
-// public int getPositifInteger() {
-// return positifInteger;
-// }
-//
-// public void setNormalFloat(float normalFloat) {
-// float old = this.normalFloat;
-// this.normalFloat = normalFloat;
-// p.firePropertyChange("normalFloat", old, normalFloat);
-// }
-//
-// public void setNormalInteger(int normalInteger) {
-// int old = this.normalInteger;
-// this.normalInteger = normalInteger;
-// p.firePropertyChange("normalInteger", old, normalInteger);
-// }
-//
-// public void setPositifFloat(float positifFloat) {
-// float old = this.positifFloat;
-// this.positifFloat = positifFloat;
-// p.firePropertyChange("positifFloat", old, positifFloat);
-// }
-//
-// public void setPositifInteger(int positifInteger) {
-// int old = this.positifInteger;
-// this.positifInteger = positifInteger;
-// p.firePropertyChange("positifInteger", old, positifInteger);
-// }
-
public void addPropertyChangeListener(PropertyChangeListener listener) {
p.addPropertyChangeListener(listener);
}
Added: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.css
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.css (rev 0)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.css 2010-09-04 20:13:40 UTC (rev 2058)
@@ -0,0 +1,26 @@
+#configPanel {
+ border:{new TitledBorder(_("jaxxdemo.numbereditor.configuration"))};
+ layout:{new GridLayout(0,1)};
+}
+
+#labelConfigLabel {
+ text:"jaxxdemo.timeeditor.label";
+}
+
+#labelConfig {
+ text:{_("jaxxdemo.timeeditor.editor")};
+}
+
+/*FIXME tchemit 2010-09-02 make this works
+#editor {
+ property:"time";
+ border:{new TitledBorder(_("jaxxdemo.timeeditor.editor"))};
+ bean:{demoModel};
+ date:{demoModel.getTime()};
+ label:{labelConfig.getText()};
+}*/
+
+#resultPane {
+ border:{new TitledBorder(_("jaxxdemo.timeeditor.model"))};
+ layout:{new BorderLayout()};
+}
Added: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx (rev 0)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemo.jaxx 2010-09-04 20:13:40 UTC (rev 2058)
@@ -0,0 +1,90 @@
+<jaxx.demo.DemoPanel layout='{new BorderLayout()}'>
+
+ <import>
+ jaxx.runtime.swing.editor.TimeEditor
+ </import>
+
+ <!-- model -->
+ <TimeEditorDemoModel id='demoModel'/>
+
+ <script><![CDATA[
+
+@Override
+protected String[] getSources() {
+ return new String[]{ getDefaultSource(),
+ "TimeEditorDemoModel.java",
+ "TimeEditorDemo.css"
+ };
+}
+
+void $afterCompleteSetup() {
+
+ // init time editor
+ editor.init();
+
+ // set current time in model
+ demoModel.setTime(new java.util.Date());
+}
+]]>
+ </script>
+
+
+ <Table insets='0' fill='both' weightx='1' constraints='BorderLayout.NORTH'>
+ <row>
+ <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'/>
+
+ <JTextField id='labelConfig' constraints='BorderLayout.CENTER'/>
+ </JPanel>
+
+ </JPanel>
+ </cell>
+ </row>
+ <row>
+ <cell>
+ <TimeEditor id='editor' constructorParams='this' property='time'
+ border='{new TitledBorder(_("jaxxdemo.timeeditor.editor"))}'
+ bean='{demoModel}'
+ date="{demoModel.getTime()}"
+ label="{labelConfig.getText()}"/>
+ </cell>
+ </row>
+ <row>
+ <cell>
+
+ <JPanel id='resultPane'>
+
+ <JLabel constraints='BorderLayout.CENTER'
+ text='{_("jaxxdemo.timeeditor.value", demoModel.getTime())}'/>
+ </JPanel>
+
+ </cell>
+ </row>
+ </Table>
+
+
+</jaxx.demo.DemoPanel>
\ No newline at end of file
Added: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemoModel.java
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemoModel.java (rev 0)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/editor/TimeEditorDemoModel.java 2010-09-04 20:13:40 UTC (rev 2058)
@@ -0,0 +1,55 @@
+package jaxx.demo.component.jaxx.editor;
+
+import jaxx.runtime.swing.editor.TimeEditor;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.Date;
+
+/**
+ * Model of a bean using the {@link TimeEditor}.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 2.2
+ */
+public class TimeEditorDemoModel {
+
+ public static final String TIME_PROPERTY = "time";
+
+ protected final PropertyChangeSupport p;
+
+ protected Date time;
+
+ public TimeEditorDemoModel() {
+ p = new PropertyChangeSupport(this);
+ }
+
+ public Date getTime() {
+ return time;
+ }
+
+ public void setTime(Date time) {
+ Date old = this.time;
+ this.time = time;
+ p.firePropertyChange(TIME_PROPERTY, old, time);
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ p.addPropertyChangeListener(listener);
+ }
+
+ public void addPropertyChangeListener(String propertyName,
+ PropertyChangeListener listener) {
+ p.addPropertyChangeListener(propertyName, listener);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ p.removePropertyChangeListener(listener);
+ }
+
+ public void removePropertyChangeListener(String propertyName,
+ PropertyChangeListener listener) {
+ p.removePropertyChangeListener(propertyName, listener);
+ }
+
+}
Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java
===================================================================
--- trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java 2010-09-04 20:13:40 UTC (rev 2058)
@@ -30,6 +30,7 @@
import jaxx.demo.component.jaxx.editor.ComboEditorDemo;
import jaxx.demo.component.jaxx.editor.I18nEditorDemo;
import jaxx.demo.component.jaxx.editor.NumberEditorDemo;
+import jaxx.demo.component.jaxx.editor.TimeEditorDemo;
import jaxx.demo.component.swing.HidorButtonDemo;
import jaxx.demo.component.swing.JButtonDemo;
import jaxx.demo.component.swing.JCheckBoxDemo;
@@ -85,7 +86,9 @@
mapping = new HashMap<String, List<Object>>();
- log.info("for " + this);
+ if (log.isDebugEnabled()) {
+ log.debug("for " + this);
+ }
addMapping("jaxxdemo.tree",
n_("jaxxdemo.component.swing"),
@@ -141,12 +144,12 @@
addMapping(n_("jaxxdemo.component.jaxx"),
HidorButtonDemo.class,
n_("jaxxdemo.component.jaxx.editor"),
- n_("jaxxdemo.component.jaxx.tree"),
StatusMessagePanelDemo.class,
BoxedDecoratorDemo.class
);
addMapping(n_("jaxxdemo.component.jaxx.editor"),
+ TimeEditorDemo.class,
NumberEditorDemo.class,
ComboEditorDemo.class,
I18nEditorDemo.class
@@ -181,8 +184,8 @@
protected void addMapping(String packageName, Object... classes) {
List<Object> list = Arrays.asList(classes);
- if (log.isInfoEnabled()) {
- log.info("Adding mapping [" + packageName + "] : " + list);
+ if (log.isDebugEnabled()) {
+ log.debug("Adding mapping [" + packageName + "] : " + list);
}
mapping.put(packageName, list);
}
Modified: trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo-en_GB.properties
===================================================================
--- trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo-en_GB.properties 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo-en_GB.properties 2010-09-04 20:13:40 UTC (rev 2058)
@@ -93,7 +93,6 @@
You\ entered\:\ =
Your\ name\:=
\\u00f7=
-actors=
adjust\ the\ spacing=
between\ these\ lines=
button\ A=
@@ -130,7 +129,6 @@
getT0().isSelected()\ &&\ getT1().isSelected()=
getT0().isSelected()\ ||\ getT1().isSelected()=
getT1().isSelected()=
-i18neditor.popup.title=
isF0()=
isF0()\ &&\ isF1()=
isF0()\ ||\ isF1()=
@@ -145,7 +143,7 @@
jaxxdemo.action.exit.tip=Quit JAXXDemo
jaxxdemo.action.fullscreen=Full screen
jaxxdemo.action.fullscreen.tip=Change to full screen mode
-jaxxdemo.action.help=Help
+jaxxdemo.action.help=
jaxxdemo.action.help.tip=Display help
jaxxdemo.action.locale.fr=French
jaxxdemo.action.locale.fr.tip=Change to french language
@@ -182,6 +180,7 @@
jaxxdemo.feature.validation=Validation
jaxxdemo.fun=Fun
jaxxdemo.i18neditor.configuration=Configuration
+jaxxdemo.i18neditor.popup.title=Title of popup
jaxxdemo.i18neditor.popupBorderText=Popup title
jaxxdemo.i18neditor.selected.locale=Selected Language
jaxxdemo.i18neditor.showIcon=Show icons
@@ -200,15 +199,19 @@
jaxxdemo.navigation.actors.title=Actors
jaxxdemo.navigation.movie.title=Movie
jaxxdemo.navigation.movies.title=Movies
-jaxxdemo.numbereditor.autoPopup=
-jaxxdemo.numbereditor.configuration=
-jaxxdemo.numbereditor.model=
-jaxxdemo.numbereditor.model.float=
-jaxxdemo.numbereditor.model.int=
-jaxxdemo.numbereditor.showPopupButton=
-jaxxdemo.numbereditor.showReset=
-jaxxdemo.numbereditor.useFloat=
-jaxxdemo.numbereditor.useSign=
+jaxxdemo.numbereditor.autoPopup=Show automatic popup
+jaxxdemo.numbereditor.configuration=Configuration
+jaxxdemo.numbereditor.model=Result
+jaxxdemo.numbereditor.model.float=Float result \: %1$s
+jaxxdemo.numbereditor.model.int=Integer result \: %1$s
+jaxxdemo.numbereditor.showPopupButton=Show Popup button
+jaxxdemo.numbereditor.showReset=Show reset button
+jaxxdemo.numbereditor.useFloat=Use float
+jaxxdemo.numbereditor.useSign=Use Sign
+jaxxdemo.timeeditor.editor=Time Editor
+jaxxdemo.timeeditor.label=Label
+jaxxdemo.timeeditor.model=Result
+jaxxdemo.timeeditor.value=Selected time \: %1$tH\:%1$tM
jaxxdemo.title.about=About JAXXDemo...
jaxxdemo.tree.age=Age
jaxxdemo.tree.firstName=First name
@@ -231,7 +234,6 @@
model1.isF0()\ &&\ model1.isF1()=
model1.isF0()\ ||\ model1.isF1()=
model1.isF1()=
-movies=Movies
t0.isSelected()=
t0.isSelected()\ &&\ t1.isSelected()=
t0.isSelected()\ ||\ t1.isSelected()=
Modified: trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo-fr_FR.properties
===================================================================
--- trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo-fr_FR.properties 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/resources/i18n/jaxx-demo-fr_FR.properties 2010-09-04 20:13:40 UTC (rev 2058)
@@ -93,7 +93,6 @@
You\ entered\:\ =
Your\ name\:=Votre nom \:
\\u00f7=
-actors=Acteurs
adjust\ the\ spacing=
between\ these\ lines=
button\ A=Bouton A
@@ -130,7 +129,6 @@
getT0().isSelected()\ &&\ getT1().isSelected()=
getT0().isSelected()\ ||\ getT1().isSelected()=
getT1().isSelected()=
-i18neditor.popup.title=
isF0()=
isF0()\ &&\ isF1()=
isF0()\ ||\ isF1()=
@@ -182,6 +180,7 @@
jaxxdemo.feature.validation=Validation
jaxxdemo.fun=Fun
jaxxdemo.i18neditor.configuration=Configuration
+jaxxdemo.i18neditor.popup.title=Titre de la popup
jaxxdemo.i18neditor.popupBorderText=Titre de la popup
jaxxdemo.i18neditor.selected.locale=Langue s\u00E9lectionn\u00E9e
jaxxdemo.i18neditor.showIcon=Afficher les icones
@@ -209,6 +208,10 @@
jaxxdemo.numbereditor.showReset=Afficher le boutton de reset
jaxxdemo.numbereditor.useFloat=Utiliser les d\u00E9cimales
jaxxdemo.numbereditor.useSign=Utiliser le signe
+jaxxdemo.timeeditor.editor=Editeur de temps
+jaxxdemo.timeeditor.label=Label
+jaxxdemo.timeeditor.model=R\u00E9sultat
+jaxxdemo.timeeditor.value=Heure s\u00E9lectionn\u00E9e \: %1$tH\:%1$tM
jaxxdemo.title.about=A propos de JAXX Demo...
jaxxdemo.tree.age=Age / ann\u00E9e
jaxxdemo.tree.firstName=Prenom
@@ -231,7 +234,6 @@
model1.isF0()\ &&\ model1.isF1()=
model1.isF0()\ ||\ model1.isF1()=
model1.isF1()=
-movies=Films
t0.isSelected()=
t0.isSelected()\ &&\ t1.isSelected()=
t0.isSelected()\ ||\ t1.isSelected()=
Modified: trunk/jaxx-demo/src/main/resources/log4j.properties
===================================================================
--- trunk/jaxx-demo/src/main/resources/log4j.properties 2010-09-04 20:13:26 UTC (rev 2057)
+++ trunk/jaxx-demo/src/main/resources/log4j.properties 2010-09-04 20:13:40 UTC (rev 2058)
@@ -5,11 +5,12 @@
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n
-log4j.logger.jaxx.demo=INFO
+log4j.logger.jaxx=INFO
+#log4j.logger.jaxx.demo=INFO
log4j.logger.jaxx.demo.tree=DEBUG
log4j.logger.jaxx.runtime.swing.tree=DEBUG
#log4j.logger.jaxx.demo.component.jaxx.tree=DEBUG
#log4j.logger.jaxx.demo.config.DemoConfig=DEBUG
-log4j.logger.jaxx.runtime.swing.editor.config=INFO
+#log4j.logger.jaxx.runtime.swing.editor.config=INFO
#log4j.logger.jaxx.runtime.swing.editor.config.model.ConfigUIModelBuilder=DEBUG
log4j.logger.org.nuiton=WARN
1
0
r2057 - trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor
by tchemit@users.nuiton.org 04 Sep '10
by tchemit@users.nuiton.org 04 Sep '10
04 Sep '10
Author: tchemit
Date: 2010-09-04 22:13:26 +0200 (Sat, 04 Sep 2010)
New Revision: 2057
Url: http://nuiton.org/repositories/revision/jaxx/2057
Log:
Anomalie #847: Can not use auto popup if showPopup is false
Modified:
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor.jaxx
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor.jaxx
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor.jaxx 2010-09-04 20:12:30 UTC (rev 2056)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditor.jaxx 2010-09-04 20:13:26 UTC (rev 2057)
@@ -25,91 +25,104 @@
<JPanel layout='{new BorderLayout()}'
- onFocusGained='textField.requestFocus()'
- onFocusLost='setPopupVisible(false);popup.setVisible(false);'
- onMouseExited='setPopupVisible(false);popup.setVisible(false);'>
+ onFocusGained='textField.requestFocus()'
+ onFocusLost='setPopupVisible(false);popup.setVisible(false);'
+ onMouseExited='setPopupVisible(false);popup.setVisible(false);'>
- <!-- onFocusGained='if (autoPopup) setPopupVisible(true); textField.requestFocus();'-->
+ <!-- onFocusGained='if (autoPopup) setPopupVisible(true); textField.requestFocus();'-->
- <!-- bean property associated with the editing value -->
- <String id='property' javaBean='""'/>
+ <!-- bean property associated with the editing value -->
+ <String id='property' javaBean='""'/>
- <!-- bean property -->
- <Object id='bean' javaBean='null'/>
+ <!-- bean property -->
+ <Object id='bean' javaBean='null'/>
- <!-- editor model -->
- <Number id="model" javaBean='null'/>
+ <!-- editor model -->
+ <Number id="model" javaBean='null'/>
- <!-- editor model type (specify it when you want to use a special type other than Integer or Float)-->
- <Class id="modelType" javaBean='null'/>
+ <!-- editor model type (specify it when you want to use a special type other than Integer or Float)-->
+ <Class id="modelType" javaBean='null'/>
- <!-- useFloat property -->
- <Boolean id='useFloat' javaBean='false'/>
-
- <!-- useSign property -->
- <Boolean id='useSign' javaBean='false'/>
+ <!-- useFloat property -->
+ <Boolean id='useFloat' javaBean='false'/>
- <!-- autoPopup property -->
- <Boolean id='autoPopup' javaBean='false'/>
+ <!-- useSign property -->
+ <Boolean id='useSign' javaBean='false'/>
- <!-- showPopupButton property -->
- <Boolean id='showPopupButton' javaBean='false'/>
+ <!-- autoPopup property -->
+ <Boolean id='autoPopup' javaBean='false'/>
- <!-- show reset property -->
- <Boolean id='showReset' javaBean='false'/>
+ <!-- showPopupButton property -->
+ <Boolean id='showPopupButton' javaBean='false'/>
- <!-- internal editor model as text -->
- <String id="modelText" javaBean='""'/>
+ <!-- show reset property -->
+ <Boolean id='showReset' javaBean='false'/>
- <!-- internal state -->
- <Boolean id='popupVisible' javaBean='false'/>
+ <!-- internal editor model as text -->
+ <String id="modelText" javaBean='""'/>
- <!-- ui handler -->
- <NumberEditorHandler id='handler' constructorParams='this'/>
-
- <!-- popup digital number editor -->
- <JPopupMenu id='popup'
- onPopupMenuWillBecomeVisible='button.setSelected(true)'
- onPopupMenuWillBecomeInvisible='button.setSelected(false)'
- onPopupMenuCanceled='button.setSelected(false)'>
- <style source='NumberEditorPopup.css'/>
- <JPanel layout='{new GridLayout(4,4)}'
- border='{BorderFactory.createEmptyBorder(4, 4, 4, 4)}'
- background='{Color.WHITE}'>
- <JButton text='numbereditor.7' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton text='numbereditor.8' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton text='numbereditor.9' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton text='numbereditor.clearAll' onActionPerformed='setModel(null)' styleClass='clear'
- enabled='{!getModelText().isEmpty()}'/>
+ <!-- internal state -->
+ <Boolean id='popupVisible' javaBean='false'/>
+ <!-- ui handler -->
+ <NumberEditorHandler id='handler' constructorParams='this'/>
- <JButton text='numbereditor.4' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton text='numbereditor.5' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton text='numbereditor.6' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton text='numbereditor.clearOne' onActionPerformed='getHandler().removeChar()' styleClass='clear'
- enabled='{!(getModelText().isEmpty() || textField.getCaretPosition() ==0 )}'/>
+ <!-- popup digital number editor -->
+ <JPopupMenu id='popup'
+ onPopupMenuWillBecomeVisible='showPopUpButton.setSelected(true)'
+ onPopupMenuWillBecomeInvisible='showPopUpButton.setSelected(false)'
+ onPopupMenuCanceled='showPopUpButton.setSelected(false)'>
+ <style source='NumberEditorPopup.css'/>
+ <JPanel layout='{new GridLayout(4,4)}'
+ border='{BorderFactory.createEmptyBorder(4, 4, 4, 4)}'
+ background='{Color.WHITE}'>
+ <JButton text='numbereditor.7' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
+ <JButton text='numbereditor.8' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
+ <JButton text='numbereditor.9' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
+ <JButton text='numbereditor.clearAll' onActionPerformed='setModel(null)'
+ styleClass='clear' enabled='{!getModelText().isEmpty()}'/>
- <JButton text='numbereditor.1' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton text='numbereditor.2' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton text='numbereditor.3' onActionPerformed='addChar(event)' styleClass='digit'/>
- <JButton enabled="false"/>
+ <JButton text='numbereditor.4' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
+ <JButton text='numbereditor.5' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
+ <JButton text='numbereditor.6' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
+ <JButton text='numbereditor.clearOne'
+ onActionPerformed='getHandler().removeChar()' styleClass='clear'
+ enabled='{!(getModelText().isEmpty() || textField.getCaretPosition() ==0 )}'/>
- <JButton text='numbereditor.0' onActionPerformed='addChar(event)' styleClass='digit'
- enabled='{!getEditor().getModelText().equals("0")}'/>
+ <JButton text='numbereditor.1' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
+ <JButton text='numbereditor.2' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
+ <JButton text='numbereditor.3' onActionPerformed='addChar(event)'
+ styleClass='digit'/>
- <JButton id='toggleSign' text='numbereditor.toggleSign' styleClass='operator'
- onActionPerformed='getHandler().toggleSign()'
- enabled='{isUseSign() && !getEditor().getModelText().isEmpty()}'/>
+ <JButton enabled="false"/>
- <JButton id='dot' text='numbereditor..' styleClass='operator'
- onActionPerformed='addChar(event)'
- enabled='{isUseFloat() && getEditor().getModelText().indexOf(".") == -1 }'/>
+ <JButton text='numbereditor.0' onActionPerformed='addChar(event)'
+ styleClass='digit'
+ enabled='{!getEditor().getModelText().equals("0")}'/>
- <JButton actionIcon='numbereditor-validate' onActionPerformed="getHandler().validate()"/>
- </JPanel>
- </JPopupMenu>
- <script><![CDATA[
+ <JButton id='toggleSign' text='numbereditor.toggleSign'
+ styleClass='operator'
+ onActionPerformed='getHandler().toggleSign()'
+ enabled='{isUseSign() && !getEditor().getModelText().isEmpty()}'/>
+
+ <JButton id='dot' text='numbereditor..' styleClass='operator'
+ onActionPerformed='addChar(event)'
+ enabled='{isUseFloat() && getEditor().getModelText().indexOf(".") == -1 }'/>
+
+ <JButton actionIcon='numbereditor-validate'
+ onActionPerformed="getHandler().validate()"/>
+ </JPanel>
+ </JPopupMenu>
+ <script><![CDATA[
public void init() {
handler.init();
}
@@ -133,41 +146,42 @@
}
]]>
- </script>
+ </script>
- <JToolBar floatable='false'
- borderPainted='false'
- visible='{isShowReset()}'
- constraints='BorderLayout.WEST'>
- <JButton id='resetButton'
- actionIcon='numbereditor-reset'
- toolTipText='numbereditor.action.reset.tip'
- focusable='false'
- focusPainted='false'
- enabled='{isEnabled()}'
- onActionPerformed='setModel(null)'/>
- </JToolBar>
-
- <JTextField id='textField'
- constraints='BorderLayout.CENTER'
- text='{getModelText()}'
- enabled='{isEnabled()}'
- onKeyReleased='getHandler().setModel(textField.getText())'
- onFocusGained='showPopup()'/>
+ <JToolBar id='toolbar'
+ floatable='false'
+ borderPainted='false'
+ visible='{isShowReset()}'
+ constraints='BorderLayout.WEST'>
+ <JButton id='resetButton'
+ actionIcon='numbereditor-reset'
+ toolTipText='numbereditor.action.reset.tip'
+ focusable='false'
+ focusPainted='false'
+ enabled='{isEnabled()}'
+ onActionPerformed='setModel(null)'/>
+ </JToolBar>
- <JToolBar constraints='BorderLayout.EAST'
- floatable='false'
- opaque='false'
- borderPainted='false'
- visible='{isShowPopupButton()}'
- maximumSize='{new Dimension(24,24)}'>
- <JToggleButton id='button'
- focusable='false'
- focusPainted='false'
- actionIcon='numbereditor-calculator'
- toolTipText='numbereditor.action.show.tip'
- enabled='{isEnabled()}'
- onActionPerformed='getHandler().setPopupVisible(!popup.isVisible())'/>
- </JToolBar>
+ <JTextField id='textField'
+ constraints='BorderLayout.CENTER'
+ text='{getModelText()}'
+ enabled='{isEnabled()}'
+ onKeyReleased='getHandler().setModel(textField.getText())'
+ onFocusGained='showPopup()'/>
+ <JToolBar constraints='BorderLayout.EAST'
+ floatable='false'
+ opaque='false'
+ borderPainted='false'
+ visible='{isShowPopupButton()}'
+ maximumSize='{new Dimension(24,24)}'>
+ <JToggleButton id='showPopUpButton'
+ focusable='false'
+ focusPainted='false'
+ actionIcon='numbereditor-calculator'
+ toolTipText='numbereditor.action.show.tip'
+ enabled='{isEnabled()}'
+ onActionPerformed='getHandler().setPopupVisible(!popup.isVisible())'/>
+ </JToolBar>
+
</JPanel>
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java 2010-09-04 20:12:30 UTC (rev 2056)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java 2010-09-04 20:13:26 UTC (rev 2057)
@@ -25,16 +25,17 @@
package jaxx.runtime.swing.editor;
-import static jaxx.runtime.swing.editor.NumberEditor.PROPERTY_MODEL;
-import static jaxx.runtime.swing.editor.NumberEditor.PROPERTY_POPUP_VISIBLE;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.swing.*;
+import javax.swing.JComponent;
+import javax.swing.JTextField;
+import javax.swing.JToggleButton;
+import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
-import java.awt.*;
+import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
@@ -45,6 +46,9 @@
import java.math.BigDecimal;
import java.math.BigInteger;
+import static jaxx.runtime.swing.editor.NumberEditor.PROPERTY_MODEL;
+import static jaxx.runtime.swing.editor.NumberEditor.PROPERTY_POPUP_VISIBLE;
+
/**
* Le handler de l'éditeur graphique de nombres.
* <p/>
@@ -54,42 +58,62 @@
* @see NumberEditor
*/
public class NumberEditorHandler {
- /**
- * Logger
- */
+ /** Logger */
public static final Log log = LogFactory.getLog(NumberEditorHandler.class);
+
public static final String VALIDATE_PROPERTY = "validate";
- /**
- * editor ui
- */
+
+ /** editor ui */
protected NumberEditor editor;
- /**
- * the mutator method on the property of boxed bean in the editor
- */
+
+ /** the mutator method on the property of boxed bean in the editor */
protected Method mutator;
- /**
- * the getter method on the property
- */
+
+ /** the getter method on the property */
protected Method getter;
- /**
- * a flag to known if mutator accept null value
- */
+
+ /** a flag to known if mutator accept null value */
protected Boolean acceptNull;
protected Class<?> modelType;
public NumberEditorHandler(NumberEditor ui) {
- this.editor = ui;
+ editor = ui;
}
- /**
- * initialise l'ui et les listeners d'évènements.
- */
+ /** initialise l'ui et les listeners d'évènements. */
public void init() {
try {
if (editor.getBean() == null) {
throw new NullPointerException("can not have a null bean in ui " + editor);
}
+
+ editor.addPropertyChangeListener(NumberEditor.PROPERTY_SHOW_POPUP_BUTTON, new PropertyChangeListener() {
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (log.isDebugEnabled()) {
+ log.debug("set showPopupButton" + evt.getNewValue() + " for " + editor.getProperty());
+ }
+ if (editor.getPopup().isVisible()) {
+ setPopupVisible(false);
+ }
+ }
+ });
+
+ editor.addPropertyChangeListener(NumberEditor.PROPERTY_AUTO_POPUP, new PropertyChangeListener() {
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (log.isDebugEnabled()) {
+ log.debug("set auto popup " + evt.getNewValue() + " for " + editor.getProperty());
+ }
+ if (editor.getPopup().isVisible()) {
+ setPopupVisible(false);
+ }
+ }
+ });
+
editor.addPropertyChangeListener(PROPERTY_MODEL, new PropertyChangeListener() {
@Override
@@ -161,9 +185,14 @@
@Override
public void run() {
- JToggleButton invoker = editor.getButton();
+ JComponent invoker =
+ editor.isShowPopupButton() ?
+ editor.getShowPopUpButton() :
+ editor;
Dimension dim = editor.getPopup().getPreferredSize();
- editor.getPopup().show(invoker, (int) (invoker.getPreferredSize().getWidth() - dim.getWidth()), invoker.getHeight());
+ int x = (int) (invoker.getPreferredSize().getWidth() - dim.getWidth());
+ editor.getPopup().show(invoker,
+ x, invoker.getHeight());
editor.getTextField().requestFocus();
}
});
@@ -373,9 +402,7 @@
}
}
- /**
- * @return l'éditeur au quel est rattaché le handler.
- */
+ /** @return l'éditeur au quel est rattaché le handler. */
public NumberEditor getEditor() {
return editor;
}
1
0
r2056 - in trunk/jaxx-widgets/src/main: java/jaxx/runtime/swing/editor resources/i18n
by tchemit@users.nuiton.org 04 Sep '10
by tchemit@users.nuiton.org 04 Sep '10
04 Sep '10
Author: tchemit
Date: 2010-09-04 22:12:30 +0200 (Sat, 04 Sep 2010)
New Revision: 2056
Url: http://nuiton.org/repositories/revision/jaxx/2056
Log:
Evolution #845: Improve TimeEditor
Modified:
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditor.css
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditor.jaxx
trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditorHandler.java
trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets-en_GB.properties
trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets-fr_FR.properties
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditor.css
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditor.css 2010-08-30 10:01:11 UTC (rev 2055)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditor.css 2010-09-04 20:12:30 UTC (rev 2056)
@@ -23,28 +23,33 @@
* #L%
*/
-#title{
+#title {
text:{getLabel()};
horizontalAlignment:center;
}
-#hour{
- value:{getTimeModel()/60};
+#hour {
+ value:{getTimeModel() / 60};
enabled:{isEnabled()};
- model:{new SpinnerNumberModel(0,0,23,1)};
+ model:{new SpinnerNumberModel(0, 0, 23, 1)};
}
#labelH {
text:"timeeditor.H";
horizontalAlignment:center;
}
-#minute{
- value:{getTimeModel()%60};
+
+#minuteModel {
+ calendarField:{java.util.Calendar.MINUTE};
+ value:{getHandler().setMinuteModel(getDate())};
+}
+
+#minute {
enabled:{isEnabled()};
- model:{new SpinnerNumberModel(0,0,59,1)};
+ model:{minuteModel};
}
-#slider{
+#slider {
font-size: 11;
paintTicks:true;
paintLabels:true;
@@ -52,5 +57,5 @@
minorTickSpacing:30;
value:{getTimeModel()};
enabled:{isEnabled()};
- model:{new DefaultBoundedRangeModel(0,1,0,60*24)};
+ model:{new DefaultBoundedRangeModel(0, 1, 0, 60 * 24)};
}
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditor.jaxx
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditor.jaxx 2010-08-30 10:01:11 UTC (rev 2055)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditor.jaxx 2010-09-04 20:12:30 UTC (rev 2056)
@@ -26,7 +26,9 @@
<JPanel layout='{new BorderLayout()}'>
- <!--<style source='TimeEditor.css'/>-->
+ <import>
+ java.util.Date
+ </import>
<!-- bean property -->
<String id='property' javaBean='""'/>
@@ -43,11 +45,15 @@
<!-- the real date -->
<java.util.Date id="date" javaBean='null'/>
+ <!-- spinner minute editor -->
+ <SpinnerDateModel id="minuteModel"/>
+
<!-- ui handler -->
<TimeEditorHandler id='handler' constructorParams='this'/>
<script><![CDATA[
public void init() {
+ minute.setEditor(new JSpinner.DateEditor(minute, "mm"));
handler.init();
}
]]>
@@ -63,14 +69,14 @@
</cell>
<cell>
<JSpinner id='hour'
- onStateChanged='setTimeModel((Integer)hour.getValue()* 60 + timeModel % 60)'/>
+ onStateChanged='setTimeModel((Integer)hour.getValue() * 60 + getHandler().getMinute())'/>
</cell>
<cell>
<JLabel id='labelH'/>
</cell>
<cell>
<JSpinner id='minute'
- onStateChanged='setTimeModel((timeModel / 60) * 60 + (Integer) minute.getValue())'/>
+ onStateChanged='getHandler().updateTimeModelFromMinuteModel(minuteModel.getDate())'/>
</cell>
</row>
</Table>
Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditorHandler.java
===================================================================
--- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditorHandler.java 2010-08-30 10:01:11 UTC (rev 2055)
+++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditorHandler.java 2010-09-04 20:12:30 UTC (rev 2056)
@@ -25,13 +25,16 @@
package jaxx.runtime.swing.editor;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.swing.JLabel;
+import javax.swing.JSlider;
+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.beans.PropertyDescriptor;
@@ -41,26 +44,34 @@
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Map;
-import javax.swing.JSlider;
-import javax.swing.plaf.basic.BasicSliderUI;
/** @author tchemit <chemit(a)codelutin.com> */
public class TimeEditorHandler {
public static final Log log = LogFactory.getLog(TimeEditorHandler.class);
+
public static final String BEAN_PROPERTY = "bean";
+
public static final String PROPERTY_PROPERTY = "property";
+
public static final String DATE_PROPERTY = "date";
+
public static final String TIME_MODEL_PROPERTY = "timeModel";
+
/** editor ui */
protected TimeEditor editor;
+
/** the mutator method on the property of boxed bean in the editor */
protected Method mutator;
+
protected Calendar calendar;
+ protected Calendar calendarMinute;
+
public TimeEditorHandler(TimeEditor ui) {
- this.editor = ui;
- this.calendar = Calendar.getInstance();
+ editor = ui;
+ calendar = Calendar.getInstance();
+ calendarMinute = Calendar.getInstance();
}
public void init() {
@@ -75,7 +86,7 @@
labelTable.put(i * 60, new JLabel(i + ""));
}
JSlider slider = editor.getSlider();
- slider.setLabelTable((Dictionary<?,?>) labelTable);
+ slider.setLabelTable((Dictionary<?, ?>) labelTable);
MouseAdapter m = new MouseAdapter() {
@@ -111,6 +122,21 @@
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;
@@ -149,6 +175,7 @@
};
slider.addMouseListener(m);
slider.addMouseMotionListener(m);
+ slider.addMouseWheelListener(m);
// listen when date changes (should come from outside)
editor.addPropertyChangeListener(DATE_PROPERTY, new PropertyChangeListener() {
@@ -166,7 +193,7 @@
if (log.isDebugEnabled()) {
log.debug("date changed : new value " + hours + ":" + minutes);
}
- getEditor().setTimeModel((hours * 60) + minutes);
+ getEditor().setTimeModel(hours * 60 + minutes);
}
});
@@ -189,6 +216,97 @@
return editor;
}
+ protected Date setMinuteModel(Date incomingDate) {
+ if (incomingDate == null) {
+ incomingDate = new Date();
+ }
+ calendarMinute.setTime(incomingDate);
+ calendarMinute.set(Calendar.HOUR_OF_DAY, 0);
+ incomingDate = calendarMinute.getTime();
+ return incomingDate;
+ }
+
+ public int getMinute() {
+ return getEditor().getTimeModel() % 60;
+ }
+
+ public int getHour() {
+ return getEditor().getTimeModel() / 60;
+ }
+
+ public void updateTimeModelFromMinuteModel(Date minuteDate) {
+
+ calendarMinute.setTime(minuteDate);
+ int newHour = calendarMinute.get(Calendar.HOUR_OF_DAY);
+ int newMinute = calendarMinute.get(Calendar.MINUTE);
+
+ int oldHour = getHour();
+ int oldMinute = getMinute();
+
+ 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) {
+
+ if (oldHour == 23) {
+
+ // can't pass from 23:59 to 0:00, stay on 23:59
+ if (log.isDebugEnabled()) {
+ log.debug("Do not update time model , stay on hh:mm = " + oldHour + ":" + oldMinute);
+ }
+ getEditor().getMinuteModel().setValue(getEditor().getMinuteModel().getPreviousValue());
+ return;
+ }
+ hour = (oldHour + 1) % 24;
+ }
+ } else if (newMinute == 59) {
+
+ // minute pass to 59 (check if a new hour is required)
+
+ if (newHour == 23) {
+
+ if (oldHour == 0) {
+
+ // can't pass from 0:00 to 23:59, stay on 0:00
+ if (log.isDebugEnabled()) {
+ log.debug("Do not update time model , stay on hh:mm = " + oldHour + ":" + oldMinute);
+ }
+ getEditor().getMinuteModel().setValue(getEditor().getMinuteModel().getNextValue());
+ return;
+ }
+
+ // decrease hour
+ hour = (oldHour - 1) % 24;
+ }
+ }
+
+ // date has changed
+ if (log.isDebugEnabled()) {
+ log.debug("Update time model to hh:mm = " + hour + ":" + minute);
+ }
+ getEditor().setTimeModel(hour * 60 + minute);
+ }
+
protected void setDate(Date oldValue, Date newValue) {
if (editor.getBean() == null) {
return;
Modified: trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets-en_GB.properties
===================================================================
--- trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets-en_GB.properties 2010-08-30 10:01:11 UTC (rev 2055)
+++ trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets-en_GB.properties 2010-09-04 20:12:30 UTC (rev 2056)
@@ -9,13 +9,9 @@
config.action.reset.tip=Cancel the modifications for the category
config.action.save=Save
config.action.save.tip=Save the modifications for the category
-config.category.needReloadApplication=Category '%1$s' \:
-config.category.needReloadUI=Category '%1$s' \:
-config.category.saved=The category '%1$s' was modified \:
config.choice.cancel=Cancel
config.choice.continue=Continue
config.choice.doNotSave=Do not save
-config.choice.ok=Ok
config.choice.save=Save
config.defaultValue=Default value
config.defaultValue.tip=Default value of the option
@@ -29,8 +25,6 @@
config.launch.callBack.tip=Perform necessary actions
config.message.quit.invalid.category=The category '%1$s' is not valid\!
config.message.quit.valid.and.modified.category=The category '%1$s' has some modified options \:
-config.model.needReloadApplication=Some options were modified and need to reload application.\n
-config.model.needReloadUI=Some options were modified and need to reload GUI.\n
config.modified=Option was modified (previous value \: %1$s)
config.no.option.selected=< No selected option >
config.option.final=This option can not be modified
@@ -38,8 +32,6 @@
config.option.modified=Value is modified < original value \: '%1$s' - new value \: '%2$s' >
config.title=Preferences
config.title.need.confirm=A confirmation is required
-config.title.will.reload.application=The application need to be restarted
-config.title.will.reload.ui=The graphical interface must be relauched
config.unmodifiable=Can not be modified
config.unvalid=Option is not valid \! (previous value \: %1$s, required type \: %2$s)
config.value=Value
Modified: trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets-fr_FR.properties
===================================================================
--- trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets-fr_FR.properties 2010-08-30 10:01:11 UTC (rev 2055)
+++ trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets-fr_FR.properties 2010-09-04 20:12:30 UTC (rev 2056)
@@ -9,13 +9,9 @@
config.action.reset.tip=Annuler les modifications de cette cat\u00E9gorie
config.action.save=Enregistrer
config.action.save.tip=Sauver les modifications de cette cat\u00E9gorie
-config.category.needReloadApplication=Cat\u00E9gorie '%1$s' \:
-config.category.needReloadUI=Cat\u00E9gorie '%1$s' \:
-config.category.saved=La cat\u00E9gorie '%1$s' a \u00E9t\u00E9 modifi\u00E9e \:
config.choice.cancel=Annuler
config.choice.continue=Continuer
config.choice.doNotSave=Ne pas enregistrer
-config.choice.ok=Ok
config.choice.save=Enregistrer
config.defaultValue=Valeur par d\u00E9faut
config.defaultValue.tip=Valeur par d\u00E9faut de l'option
@@ -29,8 +25,6 @@
config.launch.callBack.tip=Lancer les actions n\u00E9cessaires
config.message.quit.invalid.category=La cat\u00E9gorie '%1$s' n'est pas valide\!
config.message.quit.valid.and.modified.category=La cat\u00E9gorie '%1$s' poss\u00E8dent des options modifi\u00E9es \:
-config.model.needReloadApplication=Des options ont \u00E9t\u00E9 modifi\u00E9es qui n\u00E9cessitent le red\u00E9marrage de l'application.\n
-config.model.needReloadUI=Des options ont \u00E9t\u00E9 modifi\u00E9es qui n\u00E9cessitent le red\u00E9marrage de l'interface graphique.\n
config.modified=Option modifi\u00E9e (valeur originale \: %1$s)
config.no.option.selected=< Pas d'option s\u00E9lectionn\u00E9e >
config.option.final=Option non modifiable
@@ -38,8 +32,6 @@
config.option.modified=Valeur modifi\u00E9e < ancienne valeur \: '%1$s' - nouvelle valeur \: '%2$s' >
config.title=Pr\u00E9f\u00E9rences
config.title.need.confirm=Une confirmation de votre part est requise...
-config.title.will.reload.application=L'application doit \u00EAtre red\u00E9marrer...
-config.title.will.reload.ui=L'interface graphique doit \u00EAtre relancer...
config.unmodifiable=Ne peut pas \u00EAtre modifi\u00E9
config.unvalid=Option non valide (valeur originale \: %1$s, type requis \: %2$s)
config.value=Valeur
1
0
r2055 - trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators
by tchemit@users.nuiton.org 30 Aug '10
by tchemit@users.nuiton.org 30 Aug '10
30 Aug '10
Author: tchemit
Date: 2010-08-30 12:01:11 +0200 (Mon, 30 Aug 2010)
New Revision: 2055
Url: http://nuiton.org/repositories/revision/jaxx/2055
Log:
reformat
Modified:
trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/BoxedCompiledObjectDecorator.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java
trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/BoxedCompiledObjectDecorator.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/BoxedCompiledObjectDecorator.java 2010-08-30 08:07:12 UTC (rev 2054)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/BoxedCompiledObjectDecorator.java 2010-08-30 10:01:11 UTC (rev 2055)
@@ -36,8 +36,8 @@
* with a JXLayer.
*
* @author tchemit <chemit(a)codelutin.com>
+ * @plexus.component role-hint="boxed" role="jaxx.compiler.CompiledObjectDecorator"
* @since 1.2
- * @plexus.component role-hint="boxed" role="jaxx.compiler.CompiledObjectDecorator"
*/
public class BoxedCompiledObjectDecorator extends DefaultCompiledObjectDecorator {
@@ -47,7 +47,13 @@
}
@Override
- public void finalizeCompiler(JAXXCompiler compiler, CompiledObject root, CompiledObject object, JavaFile javaFile, String packageName, String className, String fullClassName) {
+ public void finalizeCompiler(JAXXCompiler compiler,
+ CompiledObject root,
+ CompiledObject object,
+ JavaFile javaFile,
+ String packageName,
+ String className,
+ String fullClassName) {
CompiledObject parent = object.getParent();
if (parent == null) {
parent = root;
@@ -55,10 +61,19 @@
for (ChildRef child : parent.getChilds()) {
if (child.getChild() == object) {
String javaCode = child.getChildJavaCode();
- child.setChildJavaCode(SwingUtil.class.getSimpleName() + ".boxComponentWithJxLayer(" + javaCode + ")");
+ child.setChildJavaCode(
+ SwingUtil.class.getSimpleName() +
+ ".boxComponentWithJxLayer(" + javaCode + ")");
break;
}
}
- super.finalizeCompiler(compiler, root, object, javaFile, packageName, className, fullClassName);
+ super.finalizeCompiler(compiler,
+ root,
+ object,
+ javaFile,
+ packageName,
+ className,
+ fullClassName
+ );
}
}
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java 2010-08-30 08:07:12 UTC (rev 2054)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java 2010-08-30 10:01:11 UTC (rev 2055)
@@ -98,18 +98,34 @@
if (log.isDebugEnabled()) {
log.debug("Add specialized getter " + methodName + " : " + body);
}
- JavaMethod getter = JavaFileGenerator.newMethod(Modifier.PUBLIC, fqn, methodName, body, true);
+ JavaMethod getter = JavaFileGenerator.newMethod(
+ Modifier.PUBLIC,
+ fqn,
+ methodName,
+ body,
+ true
+ );
javaFile.addMethod(getter);
}
} else {
- int access = id.startsWith("$") ? Modifier.PRIVATE : Modifier.PROTECTED;
+ int access = id.startsWith("$") ? Modifier.PRIVATE :
+ Modifier.PROTECTED;
if (root.equals(object)) {
- JavaField field = JavaFileGenerator.newField(access, className, id, false, "this");
+ JavaField field = JavaFileGenerator.newField(access,
+ className,
+ id,
+ false,
+ "this"
+ );
javaFile.addSimpleField(field);
} else {
-
- JavaField field = JavaFileGenerator.newField(access, fqn, id, override);
+
+ JavaField field = JavaFileGenerator.newField(access,
+ fqn,
+ id,
+ override
+ );
javaFile.addField(field, object.isJavaBean());
}
}
@@ -138,16 +154,19 @@
}
@Override
- public String getCreationCode(JAXXCompiler compiler, CompiledObject object) throws CompilerException {
+ public String getCreationCode(JAXXCompiler compiler,
+ CompiledObject object) throws CompilerException {
if (object instanceof ScriptInitializer) {
- throw new IllegalStateException("A script initializer can not come in getCreationcode method!");
+ throw new IllegalStateException(
+ "A script initializer can not come in getCreationcode method!");
}
String eol = JAXXCompiler.getLineSeparator();
StringBuffer result = new StringBuffer();
StringBuilder init = new StringBuilder();
- if (compiler.getRootObject().equals(object) || compiler.inlineCreation(object)) {
+ if (compiler.getRootObject().equals(object) ||
+ compiler.inlineCreation(object)) {
result.append("// inline creation of ").append(object.getId());
}
@@ -225,14 +244,18 @@
}
@Override
- public String createCompleteSetupMethod(JAXXCompiler compiler, CompiledObject object, JavaFile javaFile) {
+ public String createCompleteSetupMethod(JAXXCompiler compiler,
+ CompiledObject object,
+ JavaFile javaFile) {
StringBuffer code = new StringBuffer();
String eol = JAXXCompiler.getLineSeparator();
if (object.getId().startsWith("$")) {
String additionCode = object.getAdditionCode();
//TC-20091025 only generate the code if not empty
if (!additionCode.isEmpty()) {
- code.append("// inline complete setup of ").append(object.getId()).append(eol);
+ code.append("// inline complete setup of ");
+ code.append(object.getId());
+ code.append(eol);
code.append(additionCode);
}
} else {
@@ -247,8 +270,15 @@
String additionCode = object.getAdditionCode();
if (additionCode.length() > 0) {
code.append(object.getAdditionMethodName()).append("();").append(eol);
- additionCode = "if (!allComponentsCreated) {" + eol + " return;" + eol + "}" + eol + additionCode;
- javaFile.addMethod(JavaFileGenerator.newMethod(Modifier.PROTECTED, "void", object.getAdditionMethodName(), additionCode, false));
+ additionCode = "if (!allComponentsCreated) {" + eol +
+ " return;" + eol + "}" + eol + additionCode;
+ javaFile.addMethod(JavaFileGenerator.newMethod(
+ Modifier.PROTECTED,
+ "void",
+ object.getAdditionMethodName(),
+ additionCode,
+ false)
+ );
}
}
String result = code.toString();
@@ -256,7 +286,11 @@
}
@Override
- public boolean createInitializer(JAXXCompiler compiler, CompiledObject root, CompiledObject object, StringBuffer code, boolean lastWasMethodCall) {
+ public boolean createInitializer(JAXXCompiler compiler,
+ CompiledObject root,
+ CompiledObject object,
+ StringBuffer code,
+ boolean lastWasMethodCall) {
String eol = JAXXCompiler.getLineSeparator();
if (object instanceof ScriptInitializer) {
@@ -272,7 +306,9 @@
if (root.equals(object)) {
String rootCode = root.getInitializationCode(compiler);
if (rootCode != null && rootCode.length() > 0) {
- code.append("// inline creation of ").append(object.getId()).append(eol);
+ code.append("// inline creation of ");
+ code.append(object.getId());
+ code.append(eol);
code.append(rootCode);
//TC-20091025 generate client properties at creation time (not at setup time)
// in some case can save to create a setup method (when there is only client properties
@@ -297,12 +333,21 @@
return lastWasMethodCall;
}
- protected void addClientProperties(CompiledObject object, StringBuffer code, String eol) {
+ protected void addClientProperties(CompiledObject object,
+ StringBuffer code,
+ String eol) {
//TC-20090327 generate client properties
if (object.hasClientProperties()) {
// generate putClientProperty invocations
- for (Entry<String, String> entry : object.getClientProperties().entrySet()) {
- code.append(object.getJavaCode()).append(".putClientProperty(\"").append(entry.getKey()).append("\", ").append(entry.getValue()).append(");").append(eol);
+ for (Entry<String, String> entry :
+ object.getClientProperties().entrySet()) {
+ code.append(object.getJavaCode());
+ code.append(".putClientProperty(\"");
+ code.append(entry.getKey());
+ code.append("\", ");
+ code.append(entry.getValue());
+ code.append(");");
+ code.append(eol);
}
}
}
Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java
===================================================================
--- trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java 2010-08-30 08:07:12 UTC (rev 2054)
+++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java 2010-08-30 10:01:11 UTC (rev 2055)
@@ -42,14 +42,12 @@
* A decorator to place on a root compiled object to process javaHelp on the file.
*
* @author tchemit <chemit(a)codelutin.com>
+ * @plexus.component role-hint="help" role="jaxx.compiler.CompiledObjectDecorator"
* @since 1.2
- * @plexus.component role-hint="help" role="jaxx.compiler.CompiledObjectDecorator"
*/
public class HelpRootCompiledObjectDecorator extends DefaultCompiledObjectDecorator {
- /**
- * the list of discovered helpId
- */
+ /** the list of discovered helpId */
protected static Set<String> helpIds = new HashSet<String>();
@Override
@@ -71,8 +69,22 @@
}
@Override
- public void finalizeCompiler(JAXXCompiler compiler, CompiledObject root, CompiledObject object, JavaFile javaFile, String packageName, String className, String fullClassName) {
- super.finalizeCompiler(compiler, root, object, javaFile, packageName, className, fullClassName);
+ public void finalizeCompiler(JAXXCompiler compiler,
+ CompiledObject root,
+ CompiledObject object,
+ JavaFile javaFile,
+ String packageName,
+ String className,
+ String fullClassName) {
+ super.finalizeCompiler(compiler,
+ root,
+ object,
+ javaFile,
+ packageName,
+ className,
+ fullClassName
+ )
+ ;
CompilerConfiguration options = compiler.getConfiguration();
if (options.isGenerateHelp()) {
@@ -80,17 +92,29 @@
// add JAXXHelpUI interface
Class<?> validatorInterface = JAXXHelpUI.class;
String helpBrokerFQN = getBrokerFQN(compiler);
- javaFile.addInterface(JAXXCompiler.getCanonicalName(validatorInterface) + "<" + helpBrokerFQN + ">");
+ javaFile.addInterface(
+ JAXXCompiler.getCanonicalName(validatorInterface) + "<" +
+ helpBrokerFQN + ">");
- javaFile.addMethod(JavaFileGenerator.newMethod(Modifier.PUBLIC, "void", "registerHelpId",
- "broker.installUI(component, helpId);", true,
+ javaFile.addMethod(JavaFileGenerator.newMethod(
+ Modifier.PUBLIC,
+ "void",
+ "registerHelpId",
+ "broker.installUI(component, helpId);",
+ true,
new JavaArgument(helpBrokerFQN, "broker"),
new JavaArgument("Component", "component"),
- new JavaArgument("String", "helpId")));
+ new JavaArgument("String", "helpId"))
+ );
- javaFile.addMethod(JavaFileGenerator.newMethod(Modifier.PUBLIC, "void", "showHelp",
- "getBroker().showHelp(this, helpId);", true,
- new JavaArgument("String", "helpId")));
+ javaFile.addMethod(JavaFileGenerator.newMethod(
+ Modifier.PUBLIC,
+ "void",
+ "showHelp",
+ "getBroker().showHelp(this, helpId);",
+ true,
+ new JavaArgument("String", "helpId"))
+ );
StringBuilder buffer = new StringBuilder();
@@ -107,7 +131,11 @@
if (helpID != null) {
buffer.append(eol);
// detects a helpId to register
- buffer.append("registerHelpId(_broker, ").append(o.getJavaCode()).append(", ").append(helpID).append(");");
+ buffer.append("registerHelpId(_broker, ");
+ buffer.append(o.getJavaCode());
+ buffer.append(", ");
+ buffer.append(helpID);
+ buffer.append(");");
//keep the helpID for helpSet generation
helpIds.add(helpID);
}
@@ -115,7 +143,8 @@
// }
if (buffer.length() > 0) {
- StringBuilder extraCode = new StringBuilder(helpBrokerFQN).append(" _broker = getBroker();");
+ StringBuilder extraCode = new StringBuilder(helpBrokerFQN);
+ extraCode.append(" _broker = getBroker();");
buffer.append(eol).append("_broker.prepareUI(this);");
buffer.append(eol);
1
0
Author: tchemit
Date: 2010-08-30 10:07:12 +0200 (Mon, 30 Aug 2010)
New Revision: 2054
Url: http://nuiton.org/repositories/revision/jaxx/2054
Log:
add begin of specification of validator 2
Modified:
trunk/src/site/rst/spec-validator2.rst
Modified: trunk/src/site/rst/spec-validator2.rst
===================================================================
--- trunk/src/site/rst/spec-validator2.rst 2010-08-30 08:02:27 UTC (rev 2053)
+++ trunk/src/site/rst/spec-validator2.rst 2010-08-30 08:07:12 UTC (rev 2054)
@@ -1,5 +1,5 @@
=========================================================================
-Amélioration de la gestion des validateurs dans les interfaces graphiques
+Amelioration de la gestion des validateurs dans les interfaces graphiques
=========================================================================
Abstract
@@ -8,48 +8,48 @@
Fonctionnement actuel
---------------------
-Dans la version 2.2 de JAXX, tout se fait à la génération : chaque composant à
-valider est encapsulé dans un layer pour pouvoir ensuite afficher l'état de
-validation de la propriété du bean qu'il représente.
+Dans la version 2.2 de JAXX, tout se fait a la generation : chaque composant a
+valider est encapsule dans un layer pour pouvoir ensuite afficher l'etat de
+validation de la propriete du bean qu'il represente.
-Cela nous force à toujours avoir un couplage fort entre ce qui est à valider
-et les composants d'édition, on ne peut pas avoir actuellement un composant
-d'édition portant sur plusieurs propriétés d'un bean.
+Cela nous force a toujours avoir un couplage fort entre ce qui est a valider
+et les composants d'edition, on ne peut pas avoir actuellement un composant
+d'edition portant sur plusieurs proprietes d'un bean.
-De même, on ne peut pas avoir des validateurs qui descendent et se greffe sur
-des composants complexes (car à la génération des composants on ne sait pas qui
+De meme, on ne peut pas avoir des validateurs qui descendent et se greffe sur
+des composants complexes (car a la generation des composants on ne sait pas qui
va les valider).
Nouveau fonctionnement
----------------------
-L'idée c'est d'utiliser un seul layer par formulaire. Cela a de multiple
+L'idee c'est d'utiliser un seul layer par formulaire. Cela a de multiple
avantages :
- utilisation de moins de resources : un layer au lieu de n.
-- ne plus altérer les composants d'édition (le fait d'ajouter un layer perturbre
+- ne plus alterer les composants d'edition (le fait d'ajouter un layer perturbre
l'affichage, et par exemple si on valider sur des boutons ils sont plus petits
que les autres et c'est moche).
-- ne plus rien figé à la génération
+- ne plus rien fige a la generation
-- permettre d'utiliser des composants d'édition portant sur plus d'une propriété
+- permettre d'utiliser des composants d'edition portant sur plus d'une propriete
Mise en place
~~~~~~~~~~~~~
- definir un nouveau tag dans JAXX BeanValidatorForm (ou un decorator) qui
- correspond au layer unique du formulaire à valider
+ correspond au layer unique du formulaire a valider
-- ecrire le layer qui va dessiner ce qu'il faut à l'écran :
+- ecrire le layer qui va dessiner ce qu'il faut a l'ecran :
- - il doit connaitre les validateurs qui lui sont attachés et il faut ainsi
- retrouver tous les composants d'édition (en descendant si besoin dans des
- sous interfaces graphiques, plus de problème car non lié à la génération).
- - il faut une méthode computeUI pour calculer la position des notifications
+ - il doit connaitre les validateurs qui lui sont attaches et il faut ainsi
+ retrouver tous les composants d'edition (en descendant si besoin dans des
+ sous interfaces graphiques, plus de probleme car non lie a la generation).
+ - il faut une methode computeUI pour calculer la position des notifications
pour chaque composant.
- - il écoute le modèle des messages de validation pour modifier la vue.
- - il écoute le composant container pour recalculer la disposition (changement
+ - il ecoute le modele des messages de validation pour modifier la vue.
+ - il ecoute le composant container pour recalculer la disposition (changement
de taille, changement de disposition,...).
1
0