Buix-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
- 1440 discussions
r782 - in trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action: factory initializer
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 18:47:27 +0000 (Thu, 24 Jul 2008)
New Revision: 782
Modified:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactory.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionConfigInitializer.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ToggleActionConfigInitializer.java
Log:
use UIHelper
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactory.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactory.java 2008-07-24 18:19:27 UTC (rev 781)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactory.java 2008-07-24 18:47:27 UTC (rev 782)
@@ -33,7 +33,6 @@
import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.Icon;
-import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import java.awt.event.ActionEvent;
@@ -170,15 +169,6 @@
return result.toArray(new MyAbstractAction[result.size()]);
}
- public static ImageIcon createImageIcon(String path) {
- java.net.URL imgURL = ActionFactory.class.getResource("/icons/" + path);
- if (imgURL != null) {
- return new ImageIcon(imgURL);
- } else {
- throw new RuntimeException("could not find icon " + path);
- }
- }
-
/**
* @param actionKey le nom de l'action tel que d�finie dans le fichier
* de mapping (sans le prefix action.)
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionConfigInitializer.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionConfigInitializer.java 2008-07-24 18:19:27 UTC (rev 781)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionConfigInitializer.java 2008-07-24 18:47:27 UTC (rev 782)
@@ -16,7 +16,6 @@
import static org.codelutin.i18n.I18n._;
import org.codelutin.jaxx.action.ActionConfig;
-import org.codelutin.jaxx.action.ActionFactory;
import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
@@ -43,7 +42,7 @@
action.putValue(Action.SHORT_DESCRIPTION, _(anno.shortDescription()));
//}
if (!anno.smallIcon().isEmpty()) {
- action.putValue(Action.SMALL_ICON, ActionFactory.createImageIcon(anno.smallIcon()));
+ action.putValue(Action.SMALL_ICON, org.codelutin.jaxx.util.UIHelper.createImageIcon(anno.smallIcon()));
}
if (anno.mnemonic() != '\0') {
action.putValue(Action.MNEMONIC_KEY, anno.mnemonic());
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ToggleActionConfigInitializer.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ToggleActionConfigInitializer.java 2008-07-24 18:19:27 UTC (rev 781)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ToggleActionConfigInitializer.java 2008-07-24 18:47:27 UTC (rev 782)
@@ -15,7 +15,6 @@
package org.codelutin.jaxx.action.initializer;
import static org.codelutin.i18n.I18n._;
-import org.codelutin.jaxx.action.ActionFactory;
import org.codelutin.jaxx.action.ToggleActionConfig;
import javax.swing.AbstractAction;
@@ -52,10 +51,10 @@
}
if (!anno.smallIcon().isEmpty()) {
- action.putValue(Action.SMALL_ICON, ActionFactory.createImageIcon(anno.smallIcon()));
+ action.putValue(Action.SMALL_ICON, org.codelutin.jaxx.util.UIHelper.createImageIcon(anno.smallIcon()));
}
if (!anno.smallIcon2().isEmpty()) {
- action.putValue(Action.SMALL_ICON + "2", ActionFactory.createImageIcon(anno.smallIcon2()));
+ action.putValue(Action.SMALL_ICON + "2", org.codelutin.jaxx.util.UIHelper.createImageIcon(anno.smallIcon2()));
}
if (anno.mnemonic() != '\0') {
1
0
r781 - in trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action: . factory
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 18:19:27 +0000 (Thu, 24 Jul 2008)
New Revision: 781
Added:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactory.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactoryFromProvider.java
Removed:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java
Log:
introduce factory package
Deleted: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 18:16:34 UTC (rev 780)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 18:19:27 UTC (rev 781)
@@ -1,395 +0,0 @@
-/*
-* ##% Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Code Lutin,
-* Tony Chemit
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* 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 Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-* ##% */
-package org.codelutin.jaxx.action;
-
-import jaxx.runtime.JAXXObject;
-import jaxx.runtime.swing.JAXXToggleButton;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.codelutin.jaxx.action.initializer.AbstractActionInitializer;
-import org.codelutin.jaxx.action.initializer.ActionConfigInitializer;
-import org.codelutin.jaxx.action.initializer.ActionInitializer;
-import org.codelutin.jaxx.action.initializer.SelectActionConfigInitializer;
-import org.codelutin.jaxx.action.initializer.ToggleActionConfigInitializer;
-
-import javax.swing.AbstractAction;
-import javax.swing.AbstractButton;
-import javax.swing.Action;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import java.awt.event.ActionEvent;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * Action factory using the ActionConfig annotations to configure the action.
- * <p/>
- * The factory is abstract, implements method {@link #init()} to fill the
- * dictonary of known action implementations.
- * <p/>
- * Use after the {@link #loadActions(jaxx.runtime.JAXXObject)} to instanciate
- * actions in ui with id equals a known action...
- * <p/>
- * TODO Finish doc
- *
- * @author chemit
- */
-public abstract class ActionFactory<A extends MyAbstractAction> {
-
- protected static Log log = LogFactory.getLog(ActionFactory.class);
-
- /** class of encapsuling action */
- protected Class<A> baseImpl;
-
- /** dictionary of known actions implementations */
- private Map<String, Class<? extends MyAbstractAction>> impls;
-
- /** dictionary of instanciated actions */
- private Map<String, MyAbstractAction> cache;
-
- protected final ActionConfigInitializer actionConfigInitializer;
- protected final ToggleActionConfigInitializer toggleActionConfigInitializer;
- protected final SelectActionConfigInitializer selectActionConfigInitializer;
-
- /**
- * Method to init the dictionary of knwon action implementations.
- *
- * @return the dictionary of known action implementations
- */
- protected abstract Map<String, Class<? extends MyAbstractAction>> init();
-
- protected List<AbstractActionInitializer> registredInitializers;
-
-
- protected ActionFactory(Class<A> baseImpl) {
- this.baseImpl = baseImpl;
- this.impls = init();
- this.cache = new TreeMap<String, MyAbstractAction>();
- this.registredInitializers = new java.util.ArrayList<AbstractActionInitializer>();
-
- this.toggleActionConfigInitializer = registerInitializer(ToggleActionConfigInitializer.class);
- this.actionConfigInitializer = registerInitializer(ActionConfigInitializer.class);
- this.selectActionConfigInitializer = registerInitializer(SelectActionConfigInitializer.class);
- }
-
- public void resetCache() {
- cache.clear();
- }
-
- @Override
- protected void finalize() throws Throwable {
- super.finalize();
- resetCache();
- impls.clear();
- }
-
- public MyAbstractAction get(String actionKey) {
- return cache.get(actionKey);
- }
-
- public MyAbstractAction[] loadActions(JAXXObject ui) {
- if (log.isDebugEnabled()) {
- log.debug("for ui " + ui.getClass());
- }
- List<MyAbstractAction> result = new ArrayList<MyAbstractAction>();
- for (Map.Entry<String, Class<? extends MyAbstractAction>> entry : implsEntrySet()) {
- String actionKey = entry.getKey();
- Object comp = ui.getObjectById(actionKey);
- if (comp == null || !(comp instanceof AbstractButton || comp instanceof JComboBox)) {
- // nothing to do
- continue;
- }
- if (log.isTraceEnabled()) {
- log.trace("detect action " + actionKey);
- }
- if (comp instanceof AbstractButton) {
- AbstractButton component = (AbstractButton) comp;
- MyAbstractAction action = newAction(actionKey, component);
-
- component.setAction(action);
-
- if (component instanceof JAXXToggleButton) {
- JAXXToggleButton glueComponent = (JAXXToggleButton) component;
- glueComponent.setIcon((Icon) action.getValue(Action.SMALL_ICON));
- Integer integer = (Integer) action.getValue(Action.MNEMONIC_KEY);
- if (integer != null) {
- glueComponent.setNormalMnemonic(integer);
- }
- glueComponent.setSelectedIcon((Icon) action.getValue(Action.SMALL_ICON + 2));
- integer = (Integer) action.getValue(Action.MNEMONIC_KEY + 2);
- if (integer != null) {
- glueComponent.setGlueMnemonic(integer);
- }
- glueComponent.setGlueText((String) action.getValue(Action.NAME + 2));
- glueComponent.setGlueTooltipText((String) action.getValue(Action.SHORT_DESCRIPTION + 2));
-
- glueComponent.setNormalText((String) action.getValue(Action.NAME));
- glueComponent.setNormalTooltipText((String) action.getValue(Action.SHORT_DESCRIPTION));
- }
-
- Boolean value = (Boolean) action.getValue("hideActionText");
- component.setHideActionText(value != null && value);
- action.setEnabled(true);
- result.add(action);
- continue;
- }
- // is JComboBox
- JComboBox component = (JComboBox) comp;
- MyAbstractAction action = newAction(actionKey, component);
-
- component.setAction(action);
- Integer val = (Integer) action.getValue("selectedIndex");
- if (val != null && val != -1 && val < component.getItemCount() && val != component.getSelectedIndex()) {
- component.setSelectedIndex(val);
- }
- result.add(action);
- }
- return result.toArray(new MyAbstractAction[result.size()]);
- }
-
- public static ImageIcon createImageIcon(String path) {
- java.net.URL imgURL = org.codelutin.jaxx.action.ActionFactory.class.getResource("/icons/" + path);
- if (imgURL != null) {
- return new ImageIcon(imgURL);
- } else {
- throw new RuntimeException("could not find icon " + path);
- }
- }
-
- /**
- * @param actionKey le nom de l'action tel que d�finie dans le fichier
- * de mapping (sans le prefix action.)
- * @param component le button o� rattacher l'action
- * @return une nouvelle instance de l'action associ�e � sa clef.
- */
- public MyAbstractAction newAction(String actionKey, JComponent component) {
- // try first in cache
- MyAbstractAction result = getActionFromCache(actionKey);
- if (result != null) {
- return result;
- }
-
- try {
- result = newActionInstance(actionKey);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- if (log.isDebugEnabled()) {
- log.debug("create <" + actionKey + " : " + result + ">");
- }
-
- // recherche de l'annotation de configuration
- ActionInitializer<?, ?> initializer = findInitializer(result.getClass());
-
- if (initializer != null) {
- initializer.initAction(component, result);
- }
-
- try {
-
- if (initializer != null) {
- if (AbstractButton.class.isAssignableFrom(initializer.getComponentImpl())) {
- finalizeNewAction((AbstractButton) component, result, initializer);
- }
-
- if (JComboBox.class.isAssignableFrom(initializer.getComponentImpl())) {
- finalizeNewAction((JComboBox) component, result, initializer);
- }
-
- return result;
- }
-
- if (component == null || component instanceof AbstractButton) {
- finalizeNewAction((AbstractButton) component, result, initializer);
- return result;
- }
-
- if (component instanceof JComboBox) {
- finalizeNewAction((JComboBox) component, result, initializer);
- }
- } finally {
- // save result in cache
- cache.put(actionKey, result);
- }
-
- return result;
- }
-
- public String[] getActionNames() {
- return impls.keySet().toArray(new String[impls.size()]);
- }
-
- public Set<Map.Entry<String, Class<? extends MyAbstractAction>>> implsEntrySet() {
- return impls.entrySet();
- }
-
- public Set<Map.Entry<String, MyAbstractAction>> cacheEntrySet() {
- return cache.entrySet();
- }
-
- public void fireAction(String actionKey, Object source, JComponent component) {
- AbstractAction action = newAction(actionKey, component);
- fireAction0(actionKey, source, action);
- }
-
- public void fireAction(String actionKey, Object source) {
- fireAction(actionKey, source, null);
- }
-
- /**
- * @param actionKey la clef de l'action
- * @return l'action deja stockee dans le cache d'action, ou <code>null</code> si non trouv�e.
- */
- public MyAbstractAction getActionFromCache(String actionKey) {
- // on v�rifie que l'action existe bien
- checkRegistredAction(actionKey);
-
- // try in cache
- if (cache.containsKey(actionKey)) {
- // use cached action
- MyAbstractAction action = cache.get(actionKey);
- if (log.isDebugEnabled()) {
- log.debug("use cache action " + action);
- }
- return action;
- }
- return null;
- }
-
- public void dispose() {
- if (log.isInfoEnabled()) {
- log.info(this);
- }
- for (String actionKey : getActionNames()) {
- MyAbstractAction action = getActionFromCache(actionKey);
- if (action != null) {
- action.disposeUI();
- }
- }
- resetCache();
- }
-
- /**
- * @param component le button o� rattacher l'action
- * @param action action
- * @param initializer initializer
- */
- protected void finalizeNewAction(AbstractButton component, MyAbstractAction action, ActionInitializer<?, ?> initializer) {
-
- if (initializer == null) {
- // no initializer matching,
- if (component != null) {
- action.putValue(Action.ACTION_COMMAND_KEY, component.getName());
- action.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText());
- action.putValue(Action.SMALL_ICON, component.getIcon());
- action.putValue(Action.NAME, component.getText());
- action.putValue(Action.MNEMONIC_KEY, component.getMnemonic());
- action.putValue("hideActionText", component.getHideActionText());
- if (component instanceof JAXXToggleButton) {
- JAXXToggleButton glueComponent = (JAXXToggleButton) component;
- action.putValue(Action.SHORT_DESCRIPTION, glueComponent.getNormalTooltipText());
- action.putValue(Action.NAME, glueComponent.getNormalText());
- action.putValue(Action.SMALL_ICON, glueComponent.getIcon());
- action.putValue(Action.MNEMONIC_KEY, glueComponent.getNormalMnemonic());
- action.putValue(Action.SHORT_DESCRIPTION + 2, glueComponent.getGlueTooltipText());
- action.putValue(Action.NAME + 2, glueComponent.getGlueText());
- action.putValue(Action.SMALL_ICON + 2, glueComponent.getSelectedIcon());
- action.putValue(Action.MNEMONIC_KEY + 2, glueComponent.getGlueMnemonic());
- }
- }
-
- }
-
- String text = (String) action.getValue(Action.NAME);
- Integer mnemo = (Integer) action.getValue(Action.MNEMONIC_KEY);
- if (mnemo != null && mnemo != '\0') {
- int pos = text.indexOf((char) mnemo.intValue());
- if (pos == -1) {
- pos = text.indexOf(Character.toLowerCase((char) mnemo.intValue()));
- }
- action.putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, pos);
- }
-
- }
-
- /**
- * @param component le select box o� rattacher l'action
- * @param action action
- * @param initializer initializer
- */
- protected void finalizeNewAction(JComboBox component, MyAbstractAction action, ActionInitializer<?, ?> initializer) {
-
- if (initializer == null) {
- action.putValue(Action.ACTION_COMMAND_KEY, component.getName());
- action.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText());
- //result.putValue("selectedIndex", component.getSelectedIndex());
- }
-
- }
-
- protected ActionInitializer findInitializer(Class<? extends AbstractAction> action) {
- for (ActionInitializer registredInitializer : registredInitializers) {
- if (registredInitializer.getAnnotation(action) != null) {
- return registredInitializer;
- }
- }
- return null;
- }
-
- protected <I extends AbstractActionInitializer> I registerInitializer(Class<I> initizalizer) {
- try {
- I instance = initizalizer.newInstance();
- registredInitializers.add(instance);
- return instance;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- protected void fireAction0(String actionKey, Object source, AbstractAction action) {
- if (action == null) {
- log.warn("could not find action " + actionKey);
- return;
- }
- ActionEvent event = new ActionEvent(source, ActionEvent.ACTION_FIRST, actionKey);
- action.actionPerformed(event);
- }
-
- protected void checkRegistredAction(String actionKey) {
- if (!impls.containsKey(actionKey)) {
- throw new IllegalStateException("can not find a registered action for key " + actionKey);
- }
- }
-
-
- protected MyAbstractAction newActionInstance(String actionKey) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
- Class<? extends MyAbstractAction> klazz = impls.get(actionKey);
- MyAbstractAction result;
- result = klazz.getConstructor(String.class).newInstance(actionKey);
- result.putValue(Action.ACTION_COMMAND_KEY, actionKey);
- return result;
- }
-}
\ No newline at end of file
Deleted: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java 2008-07-24 18:16:34 UTC (rev 780)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java 2008-07-24 18:19:27 UTC (rev 781)
@@ -1,64 +0,0 @@
-/*
-* ##% Copyright (C) 2007, 2008 Code Lutin, Tony Chemit
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* 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 Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-* ##% */
-package org.codelutin.jaxx.action;
-
-import org.codelutin.jaxx.action.provider.ActionProvider;
-
-import java.util.Map;
-import java.util.ServiceLoader;
-import java.util.TreeMap;
-
-/**
- * A simple implementation of {@link ActionFactory} using a properties file to
- * load action mapping.
- * <p/>
- * An entry is in that form : <code>action.actionName=fqn</code> where
- * <p/>
- * <code>actionName</code> is the key of action used in factory, and
- * <code>fqn</code> is the fully qualified name of the implemented action class.
- *
- * @author chemit
- */
-public class ActionFactoryFromProvider<A extends MyAbstractAction> extends ActionFactory<A> {
-
- public static <A extends MyAbstractAction> ActionFactoryFromProvider<A> newInstance(Class<A> klazz) {
- return new ActionFactoryFromProvider<A>(klazz);
- }
-
- protected ActionFactoryFromProvider(Class<A> baseClass) {
- super(baseClass);
- }
-
- protected Map<String, Class<? extends MyAbstractAction>> init() {
- if (log.isDebugEnabled()) {
- log.debug("start loading " + this);
- }
- // obtain a ServiceLoader on ActionProvider
- ServiceLoader<ActionProvider> loader = ServiceLoader.load(ActionProvider.class);
- Map<String, Class<? extends MyAbstractAction>> cache = new TreeMap<String, Class<? extends MyAbstractAction>>();
-
- for (ActionProvider<?> actionProvider : loader) {
- if (log.isDebugEnabled()) {
- log.debug("found " + actionProvider);
- }
- cache.putAll(actionProvider.getClasses());
- }
- return cache;
- }
-
-}
\ No newline at end of file
Copied: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactory.java (from rev 780, trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java)
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactory.java (rev 0)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactory.java 2008-07-24 18:19:27 UTC (rev 781)
@@ -0,0 +1,396 @@
+/*
+* ##% Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Code Lutin,
+* Tony Chemit
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* 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 Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+* ##% */
+package org.codelutin.jaxx.action.factory;
+
+import jaxx.runtime.JAXXObject;
+import jaxx.runtime.swing.JAXXToggleButton;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codelutin.jaxx.action.MyAbstractAction;
+import org.codelutin.jaxx.action.initializer.AbstractActionInitializer;
+import org.codelutin.jaxx.action.initializer.ActionConfigInitializer;
+import org.codelutin.jaxx.action.initializer.ActionInitializer;
+import org.codelutin.jaxx.action.initializer.SelectActionConfigInitializer;
+import org.codelutin.jaxx.action.initializer.ToggleActionConfigInitializer;
+
+import javax.swing.AbstractAction;
+import javax.swing.AbstractButton;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import java.awt.event.ActionEvent;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * Action factory using the ActionConfig annotations to configure the action.
+ * <p/>
+ * The factory is abstract, implements method {@link #init()} to fill the
+ * dictonary of known action implementations.
+ * <p/>
+ * Use after the {@link #loadActions(jaxx.runtime.JAXXObject)} to instanciate
+ * actions in ui with id equals a known action...
+ * <p/>
+ * TODO Finish doc
+ *
+ * @author chemit
+ */
+public abstract class ActionFactory<A extends MyAbstractAction> {
+
+ protected static Log log = LogFactory.getLog(ActionFactory.class);
+
+ /** class of encapsuling action */
+ protected Class<A> baseImpl;
+
+ /** dictionary of known actions implementations */
+ private Map<String, Class<? extends MyAbstractAction>> impls;
+
+ /** dictionary of instanciated actions */
+ private Map<String, MyAbstractAction> cache;
+
+ protected final ActionConfigInitializer actionConfigInitializer;
+ protected final ToggleActionConfigInitializer toggleActionConfigInitializer;
+ protected final SelectActionConfigInitializer selectActionConfigInitializer;
+
+ /**
+ * Method to init the dictionary of knwon action implementations.
+ *
+ * @return the dictionary of known action implementations
+ */
+ protected abstract Map<String, Class<? extends MyAbstractAction>> init();
+
+ protected List<AbstractActionInitializer> registredInitializers;
+
+
+ protected ActionFactory(Class<A> baseImpl) {
+ this.baseImpl = baseImpl;
+ this.impls = init();
+ this.cache = new TreeMap<String, MyAbstractAction>();
+ this.registredInitializers = new java.util.ArrayList<AbstractActionInitializer>();
+
+ this.toggleActionConfigInitializer = registerInitializer(ToggleActionConfigInitializer.class);
+ this.actionConfigInitializer = registerInitializer(ActionConfigInitializer.class);
+ this.selectActionConfigInitializer = registerInitializer(SelectActionConfigInitializer.class);
+ }
+
+ public void resetCache() {
+ cache.clear();
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ super.finalize();
+ resetCache();
+ impls.clear();
+ }
+
+ public MyAbstractAction get(String actionKey) {
+ return cache.get(actionKey);
+ }
+
+ public MyAbstractAction[] loadActions(JAXXObject ui) {
+ if (log.isDebugEnabled()) {
+ log.debug("for ui " + ui.getClass());
+ }
+ List<MyAbstractAction> result = new ArrayList<MyAbstractAction>();
+ for (Map.Entry<String, Class<? extends MyAbstractAction>> entry : implsEntrySet()) {
+ String actionKey = entry.getKey();
+ Object comp = ui.getObjectById(actionKey);
+ if (comp == null || !(comp instanceof AbstractButton || comp instanceof JComboBox)) {
+ // nothing to do
+ continue;
+ }
+ if (log.isTraceEnabled()) {
+ log.trace("detect action " + actionKey);
+ }
+ if (comp instanceof AbstractButton) {
+ AbstractButton component = (AbstractButton) comp;
+ MyAbstractAction action = newAction(actionKey, component);
+
+ component.setAction(action);
+
+ if (component instanceof JAXXToggleButton) {
+ JAXXToggleButton glueComponent = (JAXXToggleButton) component;
+ glueComponent.setIcon((Icon) action.getValue(Action.SMALL_ICON));
+ Integer integer = (Integer) action.getValue(Action.MNEMONIC_KEY);
+ if (integer != null) {
+ glueComponent.setNormalMnemonic(integer);
+ }
+ glueComponent.setSelectedIcon((Icon) action.getValue(Action.SMALL_ICON + 2));
+ integer = (Integer) action.getValue(Action.MNEMONIC_KEY + 2);
+ if (integer != null) {
+ glueComponent.setGlueMnemonic(integer);
+ }
+ glueComponent.setGlueText((String) action.getValue(Action.NAME + 2));
+ glueComponent.setGlueTooltipText((String) action.getValue(Action.SHORT_DESCRIPTION + 2));
+
+ glueComponent.setNormalText((String) action.getValue(Action.NAME));
+ glueComponent.setNormalTooltipText((String) action.getValue(Action.SHORT_DESCRIPTION));
+ }
+
+ Boolean value = (Boolean) action.getValue("hideActionText");
+ component.setHideActionText(value != null && value);
+ action.setEnabled(true);
+ result.add(action);
+ continue;
+ }
+ // is JComboBox
+ JComboBox component = (JComboBox) comp;
+ MyAbstractAction action = newAction(actionKey, component);
+
+ component.setAction(action);
+ Integer val = (Integer) action.getValue("selectedIndex");
+ if (val != null && val != -1 && val < component.getItemCount() && val != component.getSelectedIndex()) {
+ component.setSelectedIndex(val);
+ }
+ result.add(action);
+ }
+ return result.toArray(new MyAbstractAction[result.size()]);
+ }
+
+ public static ImageIcon createImageIcon(String path) {
+ java.net.URL imgURL = ActionFactory.class.getResource("/icons/" + path);
+ if (imgURL != null) {
+ return new ImageIcon(imgURL);
+ } else {
+ throw new RuntimeException("could not find icon " + path);
+ }
+ }
+
+ /**
+ * @param actionKey le nom de l'action tel que d�finie dans le fichier
+ * de mapping (sans le prefix action.)
+ * @param component le button o� rattacher l'action
+ * @return une nouvelle instance de l'action associ�e � sa clef.
+ */
+ public MyAbstractAction newAction(String actionKey, JComponent component) {
+ // try first in cache
+ MyAbstractAction result = getActionFromCache(actionKey);
+ if (result != null) {
+ return result;
+ }
+
+ try {
+ result = newActionInstance(actionKey);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("create <" + actionKey + " : " + result + ">");
+ }
+
+ // recherche de l'annotation de configuration
+ ActionInitializer<?, ?> initializer = findInitializer(result.getClass());
+
+ if (initializer != null) {
+ initializer.initAction(component, result);
+ }
+
+ try {
+
+ if (initializer != null) {
+ if (AbstractButton.class.isAssignableFrom(initializer.getComponentImpl())) {
+ finalizeNewAction((AbstractButton) component, result, initializer);
+ }
+
+ if (JComboBox.class.isAssignableFrom(initializer.getComponentImpl())) {
+ finalizeNewAction((JComboBox) component, result, initializer);
+ }
+
+ return result;
+ }
+
+ if (component == null || component instanceof AbstractButton) {
+ finalizeNewAction((AbstractButton) component, result, initializer);
+ return result;
+ }
+
+ if (component instanceof JComboBox) {
+ finalizeNewAction((JComboBox) component, result, initializer);
+ }
+ } finally {
+ // save result in cache
+ cache.put(actionKey, result);
+ }
+
+ return result;
+ }
+
+ public String[] getActionNames() {
+ return impls.keySet().toArray(new String[impls.size()]);
+ }
+
+ public Set<Map.Entry<String, Class<? extends MyAbstractAction>>> implsEntrySet() {
+ return impls.entrySet();
+ }
+
+ public Set<Map.Entry<String, MyAbstractAction>> cacheEntrySet() {
+ return cache.entrySet();
+ }
+
+ public void fireAction(String actionKey, Object source, JComponent component) {
+ AbstractAction action = newAction(actionKey, component);
+ fireAction0(actionKey, source, action);
+ }
+
+ public void fireAction(String actionKey, Object source) {
+ fireAction(actionKey, source, null);
+ }
+
+ /**
+ * @param actionKey la clef de l'action
+ * @return l'action deja stockee dans le cache d'action, ou <code>null</code> si non trouv�e.
+ */
+ public MyAbstractAction getActionFromCache(String actionKey) {
+ // on v�rifie que l'action existe bien
+ checkRegistredAction(actionKey);
+
+ // try in cache
+ if (cache.containsKey(actionKey)) {
+ // use cached action
+ MyAbstractAction action = cache.get(actionKey);
+ if (log.isDebugEnabled()) {
+ log.debug("use cache action " + action);
+ }
+ return action;
+ }
+ return null;
+ }
+
+ public void dispose() {
+ if (log.isInfoEnabled()) {
+ log.info(this);
+ }
+ for (String actionKey : getActionNames()) {
+ MyAbstractAction action = getActionFromCache(actionKey);
+ if (action != null) {
+ action.disposeUI();
+ }
+ }
+ resetCache();
+ }
+
+ /**
+ * @param component le button o� rattacher l'action
+ * @param action action
+ * @param initializer initializer
+ */
+ protected void finalizeNewAction(AbstractButton component, MyAbstractAction action, ActionInitializer<?, ?> initializer) {
+
+ if (initializer == null) {
+ // no initializer matching,
+ if (component != null) {
+ action.putValue(Action.ACTION_COMMAND_KEY, component.getName());
+ action.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText());
+ action.putValue(Action.SMALL_ICON, component.getIcon());
+ action.putValue(Action.NAME, component.getText());
+ action.putValue(Action.MNEMONIC_KEY, component.getMnemonic());
+ action.putValue("hideActionText", component.getHideActionText());
+ if (component instanceof JAXXToggleButton) {
+ JAXXToggleButton glueComponent = (JAXXToggleButton) component;
+ action.putValue(Action.SHORT_DESCRIPTION, glueComponent.getNormalTooltipText());
+ action.putValue(Action.NAME, glueComponent.getNormalText());
+ action.putValue(Action.SMALL_ICON, glueComponent.getIcon());
+ action.putValue(Action.MNEMONIC_KEY, glueComponent.getNormalMnemonic());
+ action.putValue(Action.SHORT_DESCRIPTION + 2, glueComponent.getGlueTooltipText());
+ action.putValue(Action.NAME + 2, glueComponent.getGlueText());
+ action.putValue(Action.SMALL_ICON + 2, glueComponent.getSelectedIcon());
+ action.putValue(Action.MNEMONIC_KEY + 2, glueComponent.getGlueMnemonic());
+ }
+ }
+
+ }
+
+ String text = (String) action.getValue(Action.NAME);
+ Integer mnemo = (Integer) action.getValue(Action.MNEMONIC_KEY);
+ if (mnemo != null && mnemo != '\0') {
+ int pos = text.indexOf((char) mnemo.intValue());
+ if (pos == -1) {
+ pos = text.indexOf(Character.toLowerCase((char) mnemo.intValue()));
+ }
+ action.putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, pos);
+ }
+
+ }
+
+ /**
+ * @param component le select box o� rattacher l'action
+ * @param action action
+ * @param initializer initializer
+ */
+ protected void finalizeNewAction(JComboBox component, MyAbstractAction action, ActionInitializer<?, ?> initializer) {
+
+ if (initializer == null) {
+ action.putValue(Action.ACTION_COMMAND_KEY, component.getName());
+ action.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText());
+ //result.putValue("selectedIndex", component.getSelectedIndex());
+ }
+
+ }
+
+ protected ActionInitializer findInitializer(Class<? extends AbstractAction> action) {
+ for (ActionInitializer registredInitializer : registredInitializers) {
+ if (registredInitializer.getAnnotation(action) != null) {
+ return registredInitializer;
+ }
+ }
+ return null;
+ }
+
+ protected <I extends AbstractActionInitializer> I registerInitializer(Class<I> initizalizer) {
+ try {
+ I instance = initizalizer.newInstance();
+ registredInitializers.add(instance);
+ return instance;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected void fireAction0(String actionKey, Object source, AbstractAction action) {
+ if (action == null) {
+ log.warn("could not find action " + actionKey);
+ return;
+ }
+ ActionEvent event = new ActionEvent(source, ActionEvent.ACTION_FIRST, actionKey);
+ action.actionPerformed(event);
+ }
+
+ protected void checkRegistredAction(String actionKey) {
+ if (!impls.containsKey(actionKey)) {
+ throw new IllegalStateException("can not find a registered action for key " + actionKey);
+ }
+ }
+
+
+ protected MyAbstractAction newActionInstance(String actionKey) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
+ Class<? extends MyAbstractAction> klazz = impls.get(actionKey);
+ MyAbstractAction result;
+ result = klazz.getConstructor(String.class).newInstance(actionKey);
+ result.putValue(Action.ACTION_COMMAND_KEY, actionKey);
+ return result;
+ }
+}
\ No newline at end of file
Copied: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactoryFromProvider.java (from rev 777, trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java)
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactoryFromProvider.java (rev 0)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/factory/ActionFactoryFromProvider.java 2008-07-24 18:19:27 UTC (rev 781)
@@ -0,0 +1,65 @@
+/*
+* ##% Copyright (C) 2007, 2008 Code Lutin, Tony Chemit
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* 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 Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+* ##% */
+package org.codelutin.jaxx.action.factory;
+
+import org.codelutin.jaxx.action.MyAbstractAction;
+import org.codelutin.jaxx.action.provider.ActionProvider;
+
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.TreeMap;
+
+/**
+ * A simple implementation of {@link ActionFactory} using a properties file to
+ * load action mapping.
+ * <p/>
+ * An entry is in that form : <code>action.actionName=fqn</code> where
+ * <p/>
+ * <code>actionName</code> is the key of action used in factory, and
+ * <code>fqn</code> is the fully qualified name of the implemented action class.
+ *
+ * @author chemit
+ */
+public class ActionFactoryFromProvider<A extends MyAbstractAction> extends ActionFactory<A> {
+
+ public static <A extends MyAbstractAction> ActionFactoryFromProvider<A> newInstance(Class<A> klazz) {
+ return new ActionFactoryFromProvider<A>(klazz);
+ }
+
+ protected ActionFactoryFromProvider(Class<A> baseClass) {
+ super(baseClass);
+ }
+
+ protected Map<String, Class<? extends MyAbstractAction>> init() {
+ if (log.isDebugEnabled()) {
+ log.debug("start loading " + this);
+ }
+ // obtain a ServiceLoader on ActionProvider
+ ServiceLoader<ActionProvider> loader = ServiceLoader.load(ActionProvider.class);
+ Map<String, Class<? extends MyAbstractAction>> cache = new TreeMap<String, Class<? extends MyAbstractAction>>();
+
+ for (ActionProvider<?> actionProvider : loader) {
+ if (log.isDebugEnabled()) {
+ log.debug("found " + actionProvider);
+ }
+ cache.putAll(actionProvider.getClasses());
+ }
+ return cache;
+ }
+
+}
\ No newline at end of file
1
0
r780 - in trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action: . initializer
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 18:16:34 +0000 (Thu, 24 Jul 2008)
New Revision: 780
Added:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java
Modified:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/AbstractActionInitializer.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionConfigInitializer.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/SelectActionConfigInitializer.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ToggleActionConfigInitializer.java
Log:
introduce interface ActionInitializer
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 18:14:26 UTC (rev 779)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 18:16:34 UTC (rev 780)
@@ -22,6 +22,7 @@
import jaxx.runtime.swing.JAXXToggleButton;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.codelutin.jaxx.action.initializer.AbstractActionInitializer;
import org.codelutin.jaxx.action.initializer.ActionConfigInitializer;
import org.codelutin.jaxx.action.initializer.ActionInitializer;
import org.codelutin.jaxx.action.initializer.SelectActionConfigInitializer;
@@ -79,14 +80,14 @@
*/
protected abstract Map<String, Class<? extends MyAbstractAction>> init();
- protected List<ActionInitializer> registredInitializers;
+ protected List<AbstractActionInitializer> registredInitializers;
protected ActionFactory(Class<A> baseImpl) {
this.baseImpl = baseImpl;
this.impls = init();
this.cache = new TreeMap<String, MyAbstractAction>();
- this.registredInitializers = new java.util.ArrayList<ActionInitializer>();
+ this.registredInitializers = new java.util.ArrayList<AbstractActionInitializer>();
this.toggleActionConfigInitializer = registerInitializer(ToggleActionConfigInitializer.class);
this.actionConfigInitializer = registerInitializer(ActionConfigInitializer.class);
@@ -358,7 +359,7 @@
return null;
}
- protected <I extends ActionInitializer> I registerInitializer(Class<I> initizalizer) {
+ protected <I extends AbstractActionInitializer> I registerInitializer(Class<I> initizalizer) {
try {
I instance = initizalizer.newInstance();
registredInitializers.add(instance);
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/AbstractActionInitializer.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/AbstractActionInitializer.java 2008-07-24 18:14:26 UTC (rev 779)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/AbstractActionInitializer.java 2008-07-24 18:16:34 UTC (rev 780)
@@ -23,7 +23,7 @@
*
* @author chemit
*/
-public abstract class AbstractActionInitializer<A extends java.lang.annotation.Annotation, C extends JComponent> {
+public abstract class AbstractActionInitializer<A extends java.lang.annotation.Annotation, C extends JComponent> implements ActionInitializer<A, C> {
final Class<A> annotationImpl;
final Class<C> componentImpl;
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionConfigInitializer.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionConfigInitializer.java 2008-07-24 18:14:26 UTC (rev 779)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionConfigInitializer.java 2008-07-24 18:16:34 UTC (rev 780)
@@ -23,7 +23,7 @@
import javax.swing.Action;
/** @author chemit */
-public class ActionConfigInitializer extends ActionInitializer<ActionConfig, AbstractButton> {
+public class ActionConfigInitializer extends AbstractActionInitializer<ActionConfig, AbstractButton> {
public ActionConfigInitializer() {
super(ActionConfig.class, AbstractButton.class);
Added: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java (rev 0)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java 2008-07-24 18:16:34 UTC (rev 780)
@@ -0,0 +1,30 @@
+/**
+ * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
+ * This program is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation; either version 2
+ * 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 Public License for more details. You
+ * should have received a copy of the GNU General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
+ * - Suite 330, Boston, MA 02111-1307, USA.
+ * # #%
+ */
+package org.codelutin.jaxx.action.initializer;
+
+import javax.swing.AbstractAction;
+import javax.swing.JComponent;
+
+/** @author chemit */
+public interface ActionInitializer<A extends java.lang.annotation.Annotation, C extends JComponent> {
+
+ A getAnnotation(Class<? extends AbstractAction> action);
+
+ A initAction(JComponent component, AbstractAction action);
+
+ Class<A> getAnnotationImpl();
+
+ Class<C> getComponentImpl();
+}
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/SelectActionConfigInitializer.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/SelectActionConfigInitializer.java 2008-07-24 18:14:26 UTC (rev 779)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/SelectActionConfigInitializer.java 2008-07-24 18:16:34 UTC (rev 780)
@@ -22,7 +22,7 @@
import javax.swing.JComboBox;
/** @author chemit */
-public class SelectActionConfigInitializer extends ActionInitializer<SelectActionConfig, JComboBox> {
+public class SelectActionConfigInitializer extends AbstractActionInitializer<SelectActionConfig, JComboBox> {
public SelectActionConfigInitializer() {
super(SelectActionConfig.class, JComboBox.class);
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ToggleActionConfigInitializer.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ToggleActionConfigInitializer.java 2008-07-24 18:14:26 UTC (rev 779)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ToggleActionConfigInitializer.java 2008-07-24 18:16:34 UTC (rev 780)
@@ -23,7 +23,7 @@
import javax.swing.Action;
/** @author chemit */
-public class ToggleActionConfigInitializer extends ActionInitializer<ToggleActionConfig, AbstractButton> {
+public class ToggleActionConfigInitializer extends AbstractActionInitializer<ToggleActionConfig, AbstractButton> {
public ToggleActionConfigInitializer() {
super(ToggleActionConfig.class, AbstractButton.class);
1
0
r779 - trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 18:14:26 +0000 (Thu, 24 Jul 2008)
New Revision: 779
Added:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/AbstractActionInitializer.java
Removed:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java
Log:
rename to abstract
Copied: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/AbstractActionInitializer.java (from rev 772, trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java)
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/AbstractActionInitializer.java (rev 0)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/AbstractActionInitializer.java 2008-07-24 18:14:26 UTC (rev 779)
@@ -0,0 +1,57 @@
+/**
+ * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
+ * This program is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation; either version 2
+ * 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 Public License for more details. You
+ * should have received a copy of the GNU General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
+ * - Suite 330, Boston, MA 02111-1307, USA.
+ * # #%
+ */
+package org.codelutin.jaxx.action.initializer;
+
+import javax.swing.AbstractAction;
+import javax.swing.JComponent;
+
+/**
+ * Initializer of a MyAbstractAction described by a typed Annotation <code>A</code> and for a certain type
+ * <code>C</code> of component.
+ *
+ * @author chemit
+ */
+public abstract class AbstractActionInitializer<A extends java.lang.annotation.Annotation, C extends JComponent> {
+
+ final Class<A> annotationImpl;
+ final Class<C> componentImpl;
+
+ protected abstract A initAction0(C component, AbstractAction action);
+
+ protected AbstractActionInitializer(Class<A> annotationImpl, Class<C> componentImpl) {
+ this.annotationImpl = annotationImpl;
+ this.componentImpl = componentImpl;
+ }
+
+ public A getAnnotation(Class<? extends AbstractAction> action) {
+ return action.getAnnotation(annotationImpl);
+ }
+
+ @SuppressWarnings({"unchecked"})
+ public A initAction(JComponent component, AbstractAction action) {
+ if (component != null && componentImpl.isAssignableFrom(component.getClass()))
+ return initAction0((C) component, action);
+
+ return null;
+ }
+
+ public Class<A> getAnnotationImpl() {
+ return annotationImpl;
+ }
+
+ public Class<C> getComponentImpl() {
+ return componentImpl;
+ }
+}
Deleted: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java 2008-07-24 16:49:08 UTC (rev 778)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/initializer/ActionInitializer.java 2008-07-24 18:14:26 UTC (rev 779)
@@ -1,57 +0,0 @@
-/**
- * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
- * This program is free software; you
- * can redistribute it and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation; either version 2
- * 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 Public License for more details. You
- * should have received a copy of the GNU General Public License along with this
- * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
- * - Suite 330, Boston, MA 02111-1307, USA.
- * # #%
- */
-package org.codelutin.jaxx.action.initializer;
-
-import javax.swing.AbstractAction;
-import javax.swing.JComponent;
-
-/**
- * Initializer of a MyAbstractAction described by a typed Annotation <code>A</code> and for a certain type
- * <code>C</code> of component.
- *
- * @author chemit
- */
-public abstract class ActionInitializer<A extends java.lang.annotation.Annotation, C extends JComponent> {
-
- final Class<A> annotationImpl;
- final Class<C> componentImpl;
-
- protected abstract A initAction0(C component, AbstractAction action);
-
- protected ActionInitializer(Class<A> annotationImpl, Class<C> componentImpl) {
- this.annotationImpl = annotationImpl;
- this.componentImpl = componentImpl;
- }
-
- public A getAnnotation(Class<? extends AbstractAction> action) {
- return action.getAnnotation(annotationImpl);
- }
-
- @SuppressWarnings({"unchecked"})
- public A initAction(JComponent component, AbstractAction action) {
- if (component != null && componentImpl.isAssignableFrom(component.getClass()))
- return initAction0((C) component, action);
-
- return null;
- }
-
- public Class<A> getAnnotationImpl() {
- return annotationImpl;
- }
-
- public Class<C> getComponentImpl() {
- return componentImpl;
- }
-}
1
0
r778 - in trunk/lutinjaxx: jaxx-swing-action/src/main/java/org/codelutin/jaxx/action maven/src/main/java/org/codelutin/jaxx
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 16:49:08 +0000 (Thu, 24 Jul 2008)
New Revision: 778
Modified:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java
trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java
Log:
update ActionFactory and plugin
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 14:10:30 UTC (rev 777)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 16:49:08 UTC (rev 778)
@@ -254,6 +254,9 @@
fireAction0(actionKey, source, action);
}
+ public void fireAction(String actionKey, Object source) {
+ fireAction(actionKey, source, null);
+ }
/**
* @param actionKey la clef de l'action
@@ -276,7 +279,9 @@
}
public void dispose() {
-
+ if (log.isInfoEnabled()) {
+ log.info(this);
+ }
for (String actionKey : getActionNames()) {
MyAbstractAction action = getActionFromCache(actionKey);
if (action != null) {
Modified: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java
===================================================================
--- trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java 2008-07-24 14:10:30 UTC (rev 777)
+++ trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java 2008-07-24 16:49:08 UTC (rev 778)
@@ -20,6 +20,7 @@
package org.codelutin.jaxx;
import org.codelutin.jaxx.action.provider.ActionProvider;
+import org.codelutin.jaxx.action.provider.ActionProviderFromProperties;
import org.codelutin.util.FileUtil;
import java.io.File;
@@ -66,7 +67,7 @@
protected static final String PROVIDER_TEMPLATE =
"package %1$s;\n" +
"\n" +
- "public class %2$s extends org.codelutin.jaxx.action.provider.ActionProviderFromProperties<%3$s> {\n" +
+ "public class %2$s extends " + ActionProviderFromProperties.class.getName() + "<%3$s> {\n" +
"\n" +
" public %2$s() {\n" +
" super(\"%5$s\", %3$s.class, \"%4$s\");\n" +
1
0
r777 - trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 14:10:30 +0000 (Thu, 24 Jul 2008)
New Revision: 777
Modified:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java
Log:
introduce provider package
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java 2008-07-24 14:10:12 UTC (rev 776)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java 2008-07-24 14:10:30 UTC (rev 777)
@@ -17,6 +17,8 @@
* ##% */
package org.codelutin.jaxx.action;
+import org.codelutin.jaxx.action.provider.ActionProvider;
+
import java.util.Map;
import java.util.ServiceLoader;
import java.util.TreeMap;
1
0
r776 - in trunk/lutinjaxx: jaxx-swing-action/src/main/java/org/codelutin/jaxx/action jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider maven/src/main/java/org/codelutin/jaxx
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 14:10:12 +0000 (Thu, 24 Jul 2008)
New Revision: 776
Added:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/AbstractActionProvider.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ActionProvider.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ActionProviderFromProperties.java
Removed:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/AbstractActionProvider.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java
Modified:
trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java
Log:
introduce provider package
Deleted: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/AbstractActionProvider.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/AbstractActionProvider.java 2008-07-24 14:08:09 UTC (rev 775)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/AbstractActionProvider.java 2008-07-24 14:10:12 UTC (rev 776)
@@ -1,72 +0,0 @@
-/**
- * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
- * This program is free software; you
- * can redistribute it and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation; either version 2
- * 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 Public License for more details. You
- * should have received a copy of the GNU General Public License along with this
- * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
- * - Suite 330, Boston, MA 02111-1307, USA.
- * # #%
- */
-package org.codelutin.jaxx.action;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.util.Map;
-
-/** @author chemit */
-public abstract class AbstractActionProvider<A extends MyAbstractAction> implements ActionProvider<A> {
-
- protected static Log log = LogFactory.getLog(AbstractActionProvider.class);
-
- protected String name;
-
- protected Class<A> baseClass;
-
- protected Map<String, Class<? extends A>> actions;
-
- protected abstract Map<String, Class<? extends A>> initCache();
-
- protected AbstractActionProvider(String name, Class<A> baseClass, boolean doInitCache) {
- this.name = name;
- this.baseClass = baseClass;
- if (doInitCache) {
- this.actions = initCache();
- }
- }
-
- public String getName() {
- return name;
- }
-
- public Class<A> getBaseClass() {
- return baseClass;
- }
-
- public Map<String, Class<? extends A>> getClasses() {
- return actions;
- }
-
- @Override
- public String toString() {
- return super.toString() + "<name:" + name + ", baseClass:" + baseClass.getSimpleName() + ">";
- }
-
- protected void clearCache() {
- if (actions != null) {
- actions.clear();
- actions = null;
- }
- }
-
- @Override
- protected void finalize() throws Throwable {
- super.finalize();
- clearCache();
- }
-}
Deleted: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java 2008-07-24 14:08:09 UTC (rev 775)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java 2008-07-24 14:10:12 UTC (rev 776)
@@ -1,33 +0,0 @@
-/**
- * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
- * This program is free software; you
- * can redistribute it and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation; either version 2
- * 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 Public License for more details. You
- * should have received a copy of the GNU General Public License along with this
- * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
- * - Suite 330, Boston, MA 02111-1307, USA.
- * # #%
- */
-package org.codelutin.jaxx.action;
-
-/**
- * Contract to be realized by a provider of Actions
- *
- * @author chemit
- */
-public interface ActionProvider<A extends MyAbstractAction> {
-
- /** @return the name of the provider */
- String getName();
-
- /** @return the base classe of provided actions */
- Class<A> getBaseClass();
-
- /** @return the provided actions classes */
- java.util.Map<String, Class<? extends A>> getClasses();
-
-}
Deleted: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java 2008-07-24 14:08:09 UTC (rev 775)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java 2008-07-24 14:10:12 UTC (rev 776)
@@ -1,85 +0,0 @@
-/**
- * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
- * This program is free software; you
- * can redistribute it and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation; either version 2
- * 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 Public License for more details. You
- * should have received a copy of the GNU General Public License along with this
- * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
- * - Suite 330, Boston, MA 02111-1307, USA.
- * # #%
- */
-package org.codelutin.jaxx.action;
-
-import static org.codelutin.i18n.I18n._;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeMap;
-
-/** @author chemit */
-public class ActionProviderFromProperties<A extends MyAbstractAction> extends AbstractActionProvider<A> {
-
- /** default prefix for an entryin mapping file. */
- protected static final String ACTION_KEY_PREFIX = "action.";
-
- protected String propertiesPath;
-
- protected ActionProviderFromProperties(String name, Class<A> baseClass, String propertiesPath) {
- super(name, baseClass, false);
- this.propertiesPath = propertiesPath;
- this.actions = initCache();
- }
-
- @SuppressWarnings({"unchecked"})
- protected Map<String, Class<? extends A>> initCache() {
-
- InputStream inputStream = null;
-
- Properties properties = new Properties();
-
- try {
- inputStream = getClass().getResourceAsStream(propertiesPath);
- if (inputStream == null) {
- throw new NullPointerException("could not find action file " + propertiesPath);
- }
- log.info("load " + propertiesPath);
- properties.load(inputStream);
- } catch (IOException e) {
- log.warn(_("jaxx.error.load.actions.file", e.getMessage()));
- throw new RuntimeException(_("jaxx.error.load.actions.file", e.getMessage()));
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- log.warn(_("jaxx.error.close.actions.file", e.getMessage()));
- //throw new RuntimeException(_("jaxx.error.load.actions.file", e.getMessage()));
- }
- }
- }
-
- Map<String, Class<? extends A>> cache = new TreeMap<String, Class<? extends A>>();
- int prefix = ACTION_KEY_PREFIX.length();
- for (Map.Entry<Object, Object> entry : properties.entrySet()) {
- String key = entry.getKey() + "";
- String qfn = entry.getValue() + "";
- try {
- Class<? extends A> implCass;
- implCass = (Class<? extends A>) Class.forName(qfn);
- String actionKey = key.substring(prefix);
- log.debug("found action <" + actionKey + " : " + implCass + ">");
- cache.put(actionKey, implCass);
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(_("jaxx.error.load.actions.class", key, qfn), e);
- }
- }
-
- return cache;
- }
-}
Copied: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/AbstractActionProvider.java (from rev 771, trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/AbstractActionProvider.java)
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/AbstractActionProvider.java (rev 0)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/AbstractActionProvider.java 2008-07-24 14:10:12 UTC (rev 776)
@@ -0,0 +1,73 @@
+/**
+ * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
+ * This program is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation; either version 2
+ * 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 Public License for more details. You
+ * should have received a copy of the GNU General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
+ * - Suite 330, Boston, MA 02111-1307, USA.
+ * # #%
+ */
+package org.codelutin.jaxx.action.provider;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codelutin.jaxx.action.MyAbstractAction;
+
+import java.util.Map;
+
+/** @author chemit */
+public abstract class AbstractActionProvider<A extends MyAbstractAction> implements ActionProvider<A> {
+
+ protected static Log log = LogFactory.getLog(AbstractActionProvider.class);
+
+ protected String name;
+
+ protected Class<A> baseClass;
+
+ protected Map<String, Class<? extends A>> actions;
+
+ protected abstract Map<String, Class<? extends A>> initCache();
+
+ protected AbstractActionProvider(String name, Class<A> baseClass, boolean doInitCache) {
+ this.name = name;
+ this.baseClass = baseClass;
+ if (doInitCache) {
+ this.actions = initCache();
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Class<A> getBaseClass() {
+ return baseClass;
+ }
+
+ public Map<String, Class<? extends A>> getClasses() {
+ return actions;
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + "<name:" + name + ", baseClass:" + baseClass.getSimpleName() + ">";
+ }
+
+ protected void clearCache() {
+ if (actions != null) {
+ actions.clear();
+ actions = null;
+ }
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ super.finalize();
+ clearCache();
+ }
+}
Copied: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ActionProvider.java (from rev 775, trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java)
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ActionProvider.java (rev 0)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ActionProvider.java 2008-07-24 14:10:12 UTC (rev 776)
@@ -0,0 +1,35 @@
+/**
+ * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
+ * This program is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation; either version 2
+ * 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 Public License for more details. You
+ * should have received a copy of the GNU General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
+ * - Suite 330, Boston, MA 02111-1307, USA.
+ * # #%
+ */
+package org.codelutin.jaxx.action.provider;
+
+import org.codelutin.jaxx.action.MyAbstractAction;
+
+/**
+ * Contract to be realized by a provider of Actions
+ *
+ * @author chemit
+ */
+public interface ActionProvider<A extends MyAbstractAction> {
+
+ /** @return the name of the provider */
+ String getName();
+
+ /** @return the base classe of provided actions */
+ Class<A> getBaseClass();
+
+ /** @return the provided actions classes */
+ java.util.Map<String, Class<? extends A>> getClasses();
+
+}
Copied: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ActionProviderFromProperties.java (from rev 775, trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java)
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ActionProviderFromProperties.java (rev 0)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/ActionProviderFromProperties.java 2008-07-24 14:10:12 UTC (rev 776)
@@ -0,0 +1,86 @@
+/**
+ * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
+ * This program is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation; either version 2
+ * 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 Public License for more details. You
+ * should have received a copy of the GNU General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
+ * - Suite 330, Boston, MA 02111-1307, USA.
+ * # #%
+ */
+package org.codelutin.jaxx.action.provider;
+
+import static org.codelutin.i18n.I18n._;
+import org.codelutin.jaxx.action.MyAbstractAction;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+import java.util.TreeMap;
+
+/** @author chemit */
+public class ActionProviderFromProperties<A extends MyAbstractAction> extends AbstractActionProvider<A> {
+
+ /** default prefix for an entryin mapping file. */
+ protected static final String ACTION_KEY_PREFIX = "action.";
+
+ protected String propertiesPath;
+
+ protected ActionProviderFromProperties(String name, Class<A> baseClass, String propertiesPath) {
+ super(name, baseClass, false);
+ this.propertiesPath = propertiesPath;
+ this.actions = initCache();
+ }
+
+ @SuppressWarnings({"unchecked"})
+ protected Map<String, Class<? extends A>> initCache() {
+
+ InputStream inputStream = null;
+
+ Properties properties = new Properties();
+
+ try {
+ inputStream = getClass().getResourceAsStream(propertiesPath);
+ if (inputStream == null) {
+ throw new NullPointerException("could not find action file " + propertiesPath);
+ }
+ log.info("load " + propertiesPath);
+ properties.load(inputStream);
+ } catch (IOException e) {
+ log.warn(_("jaxx.error.load.actions.file", e.getMessage()));
+ throw new RuntimeException(_("jaxx.error.load.actions.file", e.getMessage()));
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ log.warn(_("jaxx.error.close.actions.file", e.getMessage()));
+ //throw new RuntimeException(_("jaxx.error.load.actions.file", e.getMessage()));
+ }
+ }
+ }
+
+ Map<String, Class<? extends A>> cache = new TreeMap<String, Class<? extends A>>();
+ int prefix = ACTION_KEY_PREFIX.length();
+ for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+ String key = entry.getKey() + "";
+ String qfn = entry.getValue() + "";
+ try {
+ Class<? extends A> implCass;
+ implCass = (Class<? extends A>) Class.forName(qfn);
+ String actionKey = key.substring(prefix);
+ log.debug("found action <" + actionKey + " : " + implCass + ">");
+ cache.put(actionKey, implCass);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException(_("jaxx.error.load.actions.class", key, qfn), e);
+ }
+ }
+
+ return cache;
+ }
+}
Modified: trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java
===================================================================
--- trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java 2008-07-24 14:08:09 UTC (rev 775)
+++ trunk/lutinjaxx/maven/src/main/java/org/codelutin/jaxx/ActionProviderGeneratorMojo.java 2008-07-24 14:10:12 UTC (rev 776)
@@ -19,14 +19,14 @@
package org.codelutin.jaxx;
-import org.codelutin.jaxx.action.ActionProvider;
+import org.codelutin.jaxx.action.provider.ActionProvider;
import org.codelutin.util.FileUtil;
import java.io.File;
import java.io.IOException;
/**
- * Classe permettant de generer un {@link org.codelutin.jaxx.action.ActionProvider} et son fichier de d�claration.
+ * Classe permettant de generer un {@link org.codelutin.jaxx.action.provider.ActionProvider} et son fichier de d�claration.
*
* @author chemit
* @goal generate-actions-provider
@@ -66,7 +66,7 @@
protected static final String PROVIDER_TEMPLATE =
"package %1$s;\n" +
"\n" +
- "public class %2$s extends org.codelutin.jaxx.action.ActionProviderFromProperties<%3$s> {\n" +
+ "public class %2$s extends org.codelutin.jaxx.action.provider.ActionProviderFromProperties<%3$s> {\n" +
"\n" +
" public %2$s() {\n" +
" super(\"%5$s\", %3$s.class, \"%4$s\");\n" +
1
0
r775 - trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 14:08:09 +0000 (Thu, 24 Jul 2008)
New Revision: 775
Added:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/provider/
Modified:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java
Log:
refactore code
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 14:05:02 UTC (rev 774)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactory.java 2008-07-24 14:08:09 UTC (rev 775)
@@ -22,7 +22,10 @@
import jaxx.runtime.swing.JAXXToggleButton;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import static org.codelutin.i18n.I18n._;
+import org.codelutin.jaxx.action.initializer.ActionConfigInitializer;
+import org.codelutin.jaxx.action.initializer.ActionInitializer;
+import org.codelutin.jaxx.action.initializer.SelectActionConfigInitializer;
+import org.codelutin.jaxx.action.initializer.ToggleActionConfigInitializer;
import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
@@ -30,6 +33,9 @@
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import java.awt.event.ActionEvent;
+import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -49,25 +55,42 @@
*
* @author chemit
*/
-public abstract class ActionFactory {
+public abstract class ActionFactory<A extends MyAbstractAction> {
protected static Log log = LogFactory.getLog(ActionFactory.class);
+ /** class of encapsuling action */
+ protected Class<A> baseImpl;
+
/** dictionary of known actions implementations */
- private Map<String, Class<? extends AbstractAction>> impls;
+ private Map<String, Class<? extends MyAbstractAction>> impls;
+
/** dictionary of instanciated actions */
- private Map<String, AbstractAction> cache;
+ private Map<String, MyAbstractAction> cache;
+ protected final ActionConfigInitializer actionConfigInitializer;
+ protected final ToggleActionConfigInitializer toggleActionConfigInitializer;
+ protected final SelectActionConfigInitializer selectActionConfigInitializer;
+
/**
* Method to init the dictionary of knwon action implementations.
*
* @return the dictionary of known action implementations
*/
- protected abstract Map<String, Class<? extends AbstractAction>> init();
+ protected abstract Map<String, Class<? extends MyAbstractAction>> init();
- protected ActionFactory() {
- impls = init();
- cache = new TreeMap<String, AbstractAction>();
+ protected List<ActionInitializer> registredInitializers;
+
+
+ protected ActionFactory(Class<A> baseImpl) {
+ this.baseImpl = baseImpl;
+ this.impls = init();
+ this.cache = new TreeMap<String, MyAbstractAction>();
+ this.registredInitializers = new java.util.ArrayList<ActionInitializer>();
+
+ this.toggleActionConfigInitializer = registerInitializer(ToggleActionConfigInitializer.class);
+ this.actionConfigInitializer = registerInitializer(ActionConfigInitializer.class);
+ this.selectActionConfigInitializer = registerInitializer(SelectActionConfigInitializer.class);
}
public void resetCache() {
@@ -81,23 +104,28 @@
impls.clear();
}
- public AbstractAction get(String actionKey) {
+ public MyAbstractAction get(String actionKey) {
return cache.get(actionKey);
}
- public AbstractAction[] loadActions(JAXXObject ui) {
- List<AbstractAction> result = new ArrayList<AbstractAction>();
- for (Map.Entry<String, Class<? extends AbstractAction>> entry : implsEntrySet()) {
+ public MyAbstractAction[] loadActions(JAXXObject ui) {
+ if (log.isDebugEnabled()) {
+ log.debug("for ui " + ui.getClass());
+ }
+ List<MyAbstractAction> result = new ArrayList<MyAbstractAction>();
+ for (Map.Entry<String, Class<? extends MyAbstractAction>> entry : implsEntrySet()) {
String actionKey = entry.getKey();
Object comp = ui.getObjectById(actionKey);
if (comp == null || !(comp instanceof AbstractButton || comp instanceof JComboBox)) {
// nothing to do
continue;
}
-
+ if (log.isTraceEnabled()) {
+ log.trace("detect action " + actionKey);
+ }
if (comp instanceof AbstractButton) {
AbstractButton component = (AbstractButton) comp;
- AbstractAction action = newAction(actionKey, component);
+ MyAbstractAction action = newAction(actionKey, component);
component.setAction(action);
@@ -126,36 +154,27 @@
result.add(action);
continue;
}
+ // is JComboBox
+ JComboBox component = (JComboBox) comp;
+ MyAbstractAction action = newAction(actionKey, component);
- if (comp instanceof JComboBox) {
- JComboBox component = (JComboBox) comp;
- AbstractAction action = newAction(actionKey, component);
-
- component.setAction(action);
- Integer val = (Integer) action.getValue("selectedIndex");
- if (val != null && val != -1 && val < component.getItemCount() && val != component.getSelectedIndex()) {
- component.setSelectedIndex(val);
- }
- result.add(action);
+ component.setAction(action);
+ Integer val = (Integer) action.getValue("selectedIndex");
+ if (val != null && val != -1 && val < component.getItemCount() && val != component.getSelectedIndex()) {
+ component.setSelectedIndex(val);
}
+ result.add(action);
}
- return result.toArray(new AbstractAction[result.size()]);
+ return result.toArray(new MyAbstractAction[result.size()]);
}
- public AbstractAction newAction0(String actionKey) {
- // on v�rifie que l'action existe bien
- checkRegistredAction(actionKey);
-
- // try in cache
- if (cache.containsKey(actionKey)) {
- // use cached action
- AbstractAction action = cache.get(actionKey);
- if (log.isDebugEnabled()) {
- log.debug("use cache action " + action);
- }
- return action;
+ public static ImageIcon createImageIcon(String path) {
+ java.net.URL imgURL = org.codelutin.jaxx.action.ActionFactory.class.getResource("/icons/" + path);
+ if (imgURL != null) {
+ return new ImageIcon(imgURL);
+ } else {
+ throw new RuntimeException("could not find icon " + path);
}
- return null;
}
/**
@@ -164,224 +183,207 @@
* @param component le button o� rattacher l'action
* @return une nouvelle instance de l'action associ�e � sa clef.
*/
- public AbstractAction newAction(String actionKey, AbstractButton component) {
-
+ public MyAbstractAction newAction(String actionKey, JComponent component) {
// try first in cache
- AbstractAction result = newAction0(actionKey);
+ MyAbstractAction result = getActionFromCache(actionKey);
if (result != null) {
return result;
}
- // on r�cup�re la classe d'implantation de l'action
- Class<? extends AbstractAction> klazz = impls.get(actionKey);
try {
- result = klazz.getConstructor(String.class).newInstance(actionKey);
- result.putValue(Action.ACTION_COMMAND_KEY, actionKey);
+ result = newActionInstance(actionKey);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
- if (log.isDebugEnabled()) {
- log.debug("create action " + actionKey + " : " + result);
- }
- // recherche de l'annotation de configuration
- ActionConfig anno = initActionConfig(component, result);
+ if (log.isDebugEnabled()) {
+ log.debug("create <" + actionKey + " : " + result + ">");
+ }
- if (anno == null) {
- ToggleActionConfig anno2 = initToggleActionConfig(component, result);
- if (anno2 == null && component != null) {
- result.putValue(Action.ACTION_COMMAND_KEY, component.getName());
- result.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText());
- result.putValue(Action.SMALL_ICON, component.getIcon());
- result.putValue(Action.NAME, component.getText());
- result.putValue(Action.MNEMONIC_KEY, component.getMnemonic());
- result.putValue("hideActionText", component.getHideActionText());
- if (component instanceof JAXXToggleButton) {
- JAXXToggleButton glueComponent = (JAXXToggleButton) component;
- result.putValue(Action.SHORT_DESCRIPTION, glueComponent.getNormalTooltipText());
- result.putValue(Action.NAME, glueComponent.getNormalText());
- result.putValue(Action.SMALL_ICON, glueComponent.getIcon());
- result.putValue(Action.MNEMONIC_KEY, glueComponent.getNormalMnemonic());
- result.putValue(Action.SHORT_DESCRIPTION + 2, glueComponent.getGlueTooltipText());
- result.putValue(Action.NAME + 2, glueComponent.getGlueText());
- result.putValue(Action.SMALL_ICON + 2, glueComponent.getSelectedIcon());
- result.putValue(Action.MNEMONIC_KEY + 2, glueComponent.getGlueMnemonic());
- }
+ // recherche de l'annotation de configuration
+ ActionInitializer<?, ?> initializer = findInitializer(result.getClass());
+
+ if (initializer != null) {
+ initializer.initAction(component, result);
+ }
+
+ try {
+
+ if (initializer != null) {
+ if (AbstractButton.class.isAssignableFrom(initializer.getComponentImpl())) {
+ finalizeNewAction((AbstractButton) component, result, initializer);
}
- }
- String text = (String) result.getValue(Action.NAME);
- Integer mnemo = (Integer) result.getValue(Action.MNEMONIC_KEY);
- if (mnemo != null && mnemo != '\0') {
- int pos = text.indexOf((char) mnemo.intValue());
- if (pos == -1) {
- pos = text.indexOf(Character.toLowerCase((char) mnemo.intValue()));
+ if (JComboBox.class.isAssignableFrom(initializer.getComponentImpl())) {
+ finalizeNewAction((JComboBox) component, result, initializer);
}
- result.putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, pos);
+
+ return result;
}
+
+ if (component == null || component instanceof AbstractButton) {
+ finalizeNewAction((AbstractButton) component, result, initializer);
+ return result;
+ }
+
+ if (component instanceof JComboBox) {
+ finalizeNewAction((JComboBox) component, result, initializer);
+ }
+ } finally {
+ // save result in cache
cache.put(actionKey, result);
- return result;
- } catch (Exception e) {
- throw new RuntimeException(e);
}
+
+ return result;
}
+ public String[] getActionNames() {
+ return impls.keySet().toArray(new String[impls.size()]);
+ }
+
+ public Set<Map.Entry<String, Class<? extends MyAbstractAction>>> implsEntrySet() {
+ return impls.entrySet();
+ }
+
+ public Set<Map.Entry<String, MyAbstractAction>> cacheEntrySet() {
+ return cache.entrySet();
+ }
+
+ public void fireAction(String actionKey, Object source, JComponent component) {
+ AbstractAction action = newAction(actionKey, component);
+ fireAction0(actionKey, source, action);
+ }
+
+
/**
- * @param actionKey le nom de l'action tel que d�finie dans le fichier
- * de mapping (sans le prefix action.)
- * @param component le button o� rattacher l'action
- * @return une nouvelle instance de l'action associ�e � sa clef.
+ * @param actionKey la clef de l'action
+ * @return l'action deja stockee dans le cache d'action, ou <code>null</code> si non trouv�e.
*/
- public AbstractAction newAction(String actionKey, JComboBox component) {
+ public MyAbstractAction getActionFromCache(String actionKey) {
+ // on v�rifie que l'action existe bien
+ checkRegistredAction(actionKey);
- // try first in cache
- AbstractAction result = newAction0(actionKey);
- if (result != null) {
- return result;
+ // try in cache
+ if (cache.containsKey(actionKey)) {
+ // use cached action
+ MyAbstractAction action = cache.get(actionKey);
+ if (log.isDebugEnabled()) {
+ log.debug("use cache action " + action);
+ }
+ return action;
}
+ return null;
+ }
- // on r�cup�re la classe d'implantation de l'action
- Class<? extends AbstractAction> klazz = impls.get(actionKey);
+ public void dispose() {
- try {
- result = klazz.getConstructor(String.class).newInstance(actionKey);
- result.putValue(Action.ACTION_COMMAND_KEY, actionKey);
-
- log.debug(actionKey + " : " + result);
- // recherche de l'annotation de configuration
- SelectActionConfig anno = initSelectActionConfig(component, result);
- if (anno == null) {
- result.putValue(Action.ACTION_COMMAND_KEY, component.getName());
- result.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText());
- //result.putValue("selectedIndex", component.getSelectedIndex());
+ for (String actionKey : getActionNames()) {
+ MyAbstractAction action = getActionFromCache(actionKey);
+ if (action != null) {
+ action.disposeUI();
}
- cache.put(actionKey, result);
- return result;
- } catch (Exception e) {
- throw new RuntimeException(e);
}
+ resetCache();
}
- public static ToggleActionConfig initToggleActionConfig(AbstractButton component, AbstractAction result) {
- ToggleActionConfig anno = result.getClass().getAnnotation(ToggleActionConfig.class);
- if (anno != null) {
- // inject les donn�es
- if (!anno.name().isEmpty()) {
- //System.out.println("found action with name : " + anno.name());
- result.putValue(Action.NAME, _(anno.name()));
- }
- if (!anno.name2().isEmpty()) {
- //System.out.println("found action with name2 : " + anno.name2());
- result.putValue(Action.NAME + "2", _(anno.name2()));
- }
+ /**
+ * @param component le button o� rattacher l'action
+ * @param action action
+ * @param initializer initializer
+ */
+ protected void finalizeNewAction(AbstractButton component, MyAbstractAction action, ActionInitializer<?, ?> initializer) {
- if (!anno.shortDescription().isEmpty()) {
- result.putValue(Action.SHORT_DESCRIPTION, _(anno.shortDescription()));
+ if (initializer == null) {
+ // no initializer matching,
+ if (component != null) {
+ action.putValue(Action.ACTION_COMMAND_KEY, component.getName());
+ action.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText());
+ action.putValue(Action.SMALL_ICON, component.getIcon());
+ action.putValue(Action.NAME, component.getText());
+ action.putValue(Action.MNEMONIC_KEY, component.getMnemonic());
+ action.putValue("hideActionText", component.getHideActionText());
+ if (component instanceof JAXXToggleButton) {
+ JAXXToggleButton glueComponent = (JAXXToggleButton) component;
+ action.putValue(Action.SHORT_DESCRIPTION, glueComponent.getNormalTooltipText());
+ action.putValue(Action.NAME, glueComponent.getNormalText());
+ action.putValue(Action.SMALL_ICON, glueComponent.getIcon());
+ action.putValue(Action.MNEMONIC_KEY, glueComponent.getNormalMnemonic());
+ action.putValue(Action.SHORT_DESCRIPTION + 2, glueComponent.getGlueTooltipText());
+ action.putValue(Action.NAME + 2, glueComponent.getGlueText());
+ action.putValue(Action.SMALL_ICON + 2, glueComponent.getSelectedIcon());
+ action.putValue(Action.MNEMONIC_KEY + 2, glueComponent.getGlueMnemonic());
+ }
}
- if (!anno.shortDescription2().isEmpty()) {
- result.putValue(Action.SHORT_DESCRIPTION + "2", _(anno.shortDescription2()));
- }
- if (!anno.smallIcon().isEmpty()) {
- result.putValue(Action.SMALL_ICON, createImageIcon(anno.smallIcon()));
- }
- if (!anno.smallIcon2().isEmpty()) {
- result.putValue(Action.SMALL_ICON + "2", createImageIcon(anno.smallIcon2()));
- }
+ }
- if (anno.mnemonic() != '\0') {
- result.putValue(Action.MNEMONIC_KEY, anno.mnemonic());
- } else if (component != null) {
- result.putValue(Action.MNEMONIC_KEY, component.getMnemonic());
+ String text = (String) action.getValue(Action.NAME);
+ Integer mnemo = (Integer) action.getValue(Action.MNEMONIC_KEY);
+ if (mnemo != null && mnemo != '\0') {
+ int pos = text.indexOf((char) mnemo.intValue());
+ if (pos == -1) {
+ pos = text.indexOf(Character.toLowerCase((char) mnemo.intValue()));
}
- if (anno.mnemonic2() != '\0') {
- result.putValue(Action.MNEMONIC_KEY + "2", anno.mnemonic2());
- }
- //TODO Convert it from String result.putValue(Action.ACCELERATOR_KEY, anno.accelerator());
+ action.putValue(Action.DISPLAYED_MNEMONIC_INDEX_KEY, pos);
+ }
+ }
- result.putValue("hideActionText", anno.hideActionText());
- result.putValue(Action.SELECTED_KEY, anno.selected());
- result.setEnabled(anno.enabled());
+ /**
+ * @param component le select box o� rattacher l'action
+ * @param action action
+ * @param initializer initializer
+ */
+ protected void finalizeNewAction(JComboBox component, MyAbstractAction action, ActionInitializer<?, ?> initializer) {
+
+ if (initializer == null) {
+ action.putValue(Action.ACTION_COMMAND_KEY, component.getName());
+ action.putValue(Action.SHORT_DESCRIPTION, component.getToolTipText());
+ //result.putValue("selectedIndex", component.getSelectedIndex());
}
- return anno;
+
}
- public static ActionConfig initActionConfig(AbstractButton component, AbstractAction result) {
- ActionConfig anno = result.getClass().getAnnotation(ActionConfig.class);
- if (anno != null) {
- // inject les donn�es
- if (!anno.name().isEmpty()) {
- //System.out.println("found action with name : " + anno.name());
- result.putValue(Action.NAME, _(anno.name()));
+ protected ActionInitializer findInitializer(Class<? extends AbstractAction> action) {
+ for (ActionInitializer registredInitializer : registredInitializers) {
+ if (registredInitializer.getAnnotation(action) != null) {
+ return registredInitializer;
}
- //if (!anno.shortDescription().isEmpty()) {
- result.putValue(Action.SHORT_DESCRIPTION, _(anno.shortDescription()));
- //}
- if (!anno.smallIcon().isEmpty()) {
- result.putValue(Action.SMALL_ICON, createImageIcon(anno.smallIcon()));
- }
- if (anno.mnemonic() != '\0') {
- result.putValue(Action.MNEMONIC_KEY, anno.mnemonic());
- } else if (component != null) {
- result.putValue(Action.MNEMONIC_KEY, component.getMnemonic());
- }
- //TODO Convert it from String result.putValue(Action.ACCELERATOR_KEY, anno.accelerator());
+ }
+ return null;
+ }
- if (component == null) {
- result.putValue("hideActionText", anno.hideActionText());
- } else {
- boolean actionText = component.getHideActionText();
- result.putValue("hideActionText", anno.hideActionText() || actionText);
- }
- result.putValue(Action.SELECTED_KEY, anno.selected());
- result.setEnabled(anno.enabled());
-
+ protected <I extends ActionInitializer> I registerInitializer(Class<I> initizalizer) {
+ try {
+ I instance = initizalizer.newInstance();
+ registredInitializers.add(instance);
+ return instance;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
}
- return anno;
}
- public static SelectActionConfig initSelectActionConfig(JComboBox component, AbstractAction result) {
- SelectActionConfig anno = result.getClass().getAnnotation(SelectActionConfig.class);
- if (anno != null) {
- // inject les donn�es
- if (!anno.name().isEmpty()) {
- result.putValue(Action.NAME, _(anno.name()));
- }
- if (!anno.shortDescription().isEmpty()) {
- result.putValue(Action.SHORT_DESCRIPTION, _(anno.shortDescription()));
- } else {
- result.putValue(Action.SHORT_DESCRIPTION, _(component.getToolTipText()));
- }
- result.putValue("selectedIndex", anno.selectedIndex());
- //TODO Convert it from String result.putValue(Action.ACCELERATOR_KEY, anno.accelerator());
- result.setEnabled(anno.enabled());
+ protected void fireAction0(String actionKey, Object source, AbstractAction action) {
+ if (action == null) {
+ log.warn("could not find action " + actionKey);
+ return;
}
- return anno;
+ ActionEvent event = new ActionEvent(source, ActionEvent.ACTION_FIRST, actionKey);
+ action.actionPerformed(event);
}
-
protected void checkRegistredAction(String actionKey) {
if (!impls.containsKey(actionKey)) {
throw new IllegalStateException("can not find a registered action for key " + actionKey);
}
}
- public String[] getActionNames() {
- return impls.keySet().toArray(new String[impls.size()]);
- }
- public Set<Map.Entry<String, Class<? extends AbstractAction>>> implsEntrySet() {
- return impls.entrySet();
+ protected MyAbstractAction newActionInstance(String actionKey) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
+ Class<? extends MyAbstractAction> klazz = impls.get(actionKey);
+ MyAbstractAction result;
+ result = klazz.getConstructor(String.class).newInstance(actionKey);
+ result.putValue(Action.ACTION_COMMAND_KEY, actionKey);
+ return result;
}
-
- public Set<Map.Entry<String, AbstractAction>> cacheEntrySet() {
- return cache.entrySet();
- }
-
- public static ImageIcon createImageIcon(String path) {
- java.net.URL imgURL = org.codelutin.jaxx.action.ActionFactory.class.getResource("/icons/" + path);
- if (imgURL != null) {
- return new ImageIcon(imgURL);
- } else {
- throw new RuntimeException("could not find icon " + path);
- }
- }
}
\ No newline at end of file
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java 2008-07-24 14:05:02 UTC (rev 774)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionFactoryFromProvider.java 2008-07-24 14:08:09 UTC (rev 775)
@@ -17,7 +17,6 @@
* ##% */
package org.codelutin.jaxx.action;
-import javax.swing.AbstractAction;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.TreeMap;
@@ -33,24 +32,27 @@
*
* @author chemit
*/
-public class ActionFactoryFromProvider extends ActionFactory {
+public class ActionFactoryFromProvider<A extends MyAbstractAction> extends ActionFactory<A> {
- /** real file where to load actions mapping */
- protected String actionFilePath;
+ public static <A extends MyAbstractAction> ActionFactoryFromProvider<A> newInstance(Class<A> klazz) {
+ return new ActionFactoryFromProvider<A>(klazz);
+ }
- public ActionFactoryFromProvider() {
- super();
+ protected ActionFactoryFromProvider(Class<A> baseClass) {
+ super(baseClass);
}
-
- protected Map<String, Class<? extends AbstractAction>> init() {
+ protected Map<String, Class<? extends MyAbstractAction>> init() {
+ if (log.isDebugEnabled()) {
+ log.debug("start loading " + this);
+ }
// obtain a ServiceLoader on ActionProvider
ServiceLoader<ActionProvider> loader = ServiceLoader.load(ActionProvider.class);
- Map<String, Class<? extends AbstractAction>> cache = new TreeMap<String, Class<? extends AbstractAction>>();
+ Map<String, Class<? extends MyAbstractAction>> cache = new TreeMap<String, Class<? extends MyAbstractAction>>();
for (ActionProvider<?> actionProvider : loader) {
if (log.isDebugEnabled()) {
- log.debug("load action provider " + actionProvider);
+ log.debug("found " + actionProvider);
}
cache.putAll(actionProvider.getClasses());
}
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java 2008-07-24 14:05:02 UTC (rev 774)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProvider.java 2008-07-24 14:08:09 UTC (rev 775)
@@ -19,7 +19,7 @@
*
* @author chemit
*/
-public interface ActionProvider<A extends javax.swing.AbstractAction> {
+public interface ActionProvider<A extends MyAbstractAction> {
/** @return the name of the provider */
String getName();
Modified: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java 2008-07-24 14:05:02 UTC (rev 774)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/ActionProviderFromProperties.java 2008-07-24 14:08:09 UTC (rev 775)
@@ -16,7 +16,6 @@
import static org.codelutin.i18n.I18n._;
-import javax.swing.AbstractAction;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
@@ -24,7 +23,7 @@
import java.util.TreeMap;
/** @author chemit */
-public class ActionProviderFromProperties<A extends AbstractAction> extends AbstractActionProvider<A> {
+public class ActionProviderFromProperties<A extends MyAbstractAction> extends AbstractActionProvider<A> {
/** default prefix for an entryin mapping file. */
protected static final String ACTION_KEY_PREFIX = "action.";
@@ -46,6 +45,9 @@
try {
inputStream = getClass().getResourceAsStream(propertiesPath);
+ if (inputStream == null) {
+ throw new NullPointerException("could not find action file " + propertiesPath);
+ }
log.info("load " + propertiesPath);
properties.load(inputStream);
} catch (IOException e) {
@@ -64,16 +66,17 @@
Map<String, Class<? extends A>> cache = new TreeMap<String, Class<? extends A>>();
int prefix = ACTION_KEY_PREFIX.length();
- for (Map.Entry<Object, Object> objectObjectEntry : properties.entrySet()) {
- String key = objectObjectEntry.getKey() + "";
- String qfn = objectObjectEntry.getValue() + "";
+ for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+ String key = entry.getKey() + "";
+ String qfn = entry.getValue() + "";
try {
Class<? extends A> implCass;
implCass = (Class<? extends A>) Class.forName(qfn);
- log.debug("found action " + implCass);
- cache.put(key.substring(prefix), implCass);
+ String actionKey = key.substring(prefix);
+ log.debug("found action <" + actionKey + " : " + implCass + ">");
+ cache.put(actionKey, implCass);
} catch (ClassNotFoundException e) {
- throw new RuntimeException(_("jaxx.error.load.actions.class", key, qfn));
+ throw new RuntimeException(_("jaxx.error.load.actions.class", key, qfn), e);
}
}
1
0
r774 - trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 14:05:02 +0000 (Thu, 24 Jul 2008)
New Revision: 774
Added:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/MyAbstractAction.java
Log:
introduce abstract action to be used by the framework
Added: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/MyAbstractAction.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/MyAbstractAction.java (rev 0)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/MyAbstractAction.java 2008-07-24 14:05:02 UTC (rev 774)
@@ -0,0 +1,106 @@
+/**
+ * # #% Copyright (C) 2008 Code Lutin, Tony Chemit
+ * This program is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation; either version 2
+ * 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 Public License for more details. You
+ * should have received a copy of the GNU General Public License along with this
+ * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place
+ * - Suite 330, Boston, MA 02111-1307, USA.
+ * # #%
+ */
+package org.codelutin.jaxx.action;
+
+import jaxx.runtime.JAXXObject;
+import org.apache.commons.logging.LogFactory;
+
+import javax.swing.AbstractAction;
+import javax.swing.JComponent;
+import java.awt.event.ActionEvent;
+
+/** @author chemit */
+public abstract class MyAbstractAction extends AbstractAction {
+
+ protected static org.apache.commons.logging.Log log = LogFactory.getLog(MyAbstractAction.class);
+
+ private static final long serialVersionUID = -810023044364620841L;
+
+ protected ActionEvent e;
+
+ protected MyAbstractAction(String name) {
+ super(name);
+ }
+
+ protected abstract String getPrefix();
+
+ public void actionPerformed(java.awt.event.ActionEvent e) {
+
+ log.debug("------------------------------------------------------------");
+ log.debug("event : " + e);
+ log.debug("source : " + e.getSource());
+ this.e = e;
+ try {
+ boolean accepted = beforeAction(e);
+ log.debug("action : " + this);
+ if (accepted) {
+ log.info(getActionName() + " (treate:" + accepted + ") : " + this);
+ } else {
+ log.debug(getActionName() + " (treate:" + accepted + ") : " + this);
+ }
+ if (accepted) {
+ doAction(e);
+ updateUI();
+ }
+ } catch (Exception e1) {
+ showError(e1);
+ } finally {
+ this.e = null;
+ // always clear action after use : actions are staless
+ clear();
+ }
+ }
+
+ protected String getActionName() {
+ return (String) getValue(ACTION_COMMAND_KEY);
+ }
+
+ protected boolean beforeAction(ActionEvent e) throws Exception {
+ return isEnabled();
+ }
+
+ protected JComponent getUIObject(String name, JAXXObject container) {
+ if (container == null) {
+ return null;
+ }
+ return (JComponent) container.getObjectById(name);
+ }
+
+ public String getI18nToolTipText() {
+ return getPrefix() + ".action." + getActionName() + ".tooltip";
+ }
+
+ protected void doAction(ActionEvent e) throws Exception {
+ // nothing by default
+ }
+
+ public void updateUI() {
+ // nothing by default
+ }
+
+ public void disposeUI() {
+ // nothing by default
+ }
+
+
+ protected void clear() {
+ // nothing by default
+ }
+
+ protected void showError(Exception e) {
+ log.error(e);
+ }
+
+}
1
0
r773 - trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
by tchemit@users.labs.libre-entreprise.org 24 Jul '08
24 Jul '08
Author: tchemit
Date: 2008-07-24 14:04:15 +0000 (Thu, 24 Jul 2008)
New Revision: 773
Removed:
trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/SimpleActionFactoryImpl.java
Log:
no more used
Deleted: trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/SimpleActionFactoryImpl.java
===================================================================
--- trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/SimpleActionFactoryImpl.java 2008-07-24 14:03:59 UTC (rev 772)
+++ trunk/lutinjaxx/jaxx-swing-action/src/main/java/org/codelutin/jaxx/action/SimpleActionFactoryImpl.java 2008-07-24 14:04:15 UTC (rev 773)
@@ -1,103 +0,0 @@
-/*
-* ##% Copyright (C) 2007, 2008 Code Lutin, Tony Chemit
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* 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 Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-* ##% */
-package org.codelutin.jaxx.action;
-
-import static org.codelutin.i18n.I18n._;
-import org.codelutin.util.Resource;
-
-import javax.swing.AbstractAction;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeMap;
-
-/**
- * A simple implementation of {@link org.codelutin.jaxx.action.ActionFactory} using a properties file to
- * load action mapping.
- * <p/>
- * An entry is in that form : <code>action.actionName=fqn</code> where
- * <p/>
- * <code>actionName</code> is the key of action used in factory, and
- * <code>fqn</code> is the fully qualified name of the implemented action class.
- *
- * @author chemit
- * @deprecated prefer use {@link org.codelutin.jaxx.action.ActionFactoryFromProvider}
- */
-public class SimpleActionFactoryImpl extends ActionFactory {
- /** default file where to load action mapping */
- protected static final String ACTIONS_FILE_PATH = "/actions.properties";
-
- /** default prefix for an entryin mapping file. */
- protected static final String ACTION_KEY_PREFIX = "action.";
-
- /** real file where to load actions mapping */
- protected String actionFilePath;
-
- public SimpleActionFactoryImpl() {
- this(ACTIONS_FILE_PATH);
- }
-
- public SimpleActionFactoryImpl(String actionFilePath) {
- this.actionFilePath = actionFilePath;
- }
-
- @SuppressWarnings({"unchecked"})
- protected Map<String, Class<? extends AbstractAction>> init() {
- Properties properties = new Properties();
- List<URL> urls = Resource.getURLs(".*jaxx/.+-actions\\.properties");
- for (URL url : urls) {
- InputStream inputStream = null;
- try {
- inputStream = url.openStream();
- log.info("load " + url);
- properties.load(inputStream);
- } catch (IOException e) {
- log.warn(_("jaxx.error.load.actions.file", e.getMessage()));
- //throw new RuntimeException(_("jaxx.error.load.actions.file", e.getMessage()));
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- log.warn(_("jaxx.error.close.actions.file", e.getMessage()));
- //throw new RuntimeException(_("jaxx.error.load.actions.file", e.getMessage()));
- }
- }
- }
- }
- Map<String, Class<? extends AbstractAction>> cache = new TreeMap<String, Class<? extends AbstractAction>>();
- int prefix = ACTION_KEY_PREFIX.length();
- for (Map.Entry<Object, Object> objectObjectEntry : properties.entrySet()) {
- String key = objectObjectEntry.getKey() + "";
- String qfn = objectObjectEntry.getValue() + "";
- try {
- Class<? extends AbstractAction> implCass;
- implCass = (Class<? extends AbstractAction>) Class.forName(qfn);
- log.debug("found action " + implCass);
- cache.put(key.substring(prefix), implCass);
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(_("jaxx.error.load.actions.class", key, qfn));
- }
- }
- return cache;
- }
-
-}
\ No newline at end of file
1
0