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
September 2010
- 3 participants
- 46 discussions
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