This is an automated email from the git hooks/post-receive script. New commit to branch feature/8429 in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 99177ba0d0b2a3385b7b1bf20fa0df3c4e7b0eb9 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Nov 10 11:56:57 2016 +0100 Ajout de raccourci clavier sur les actions des formulaires --- .../swing/ObserveSwingApplicationContext.java | 96 +++---------- .../application/swing/ui/ObserveMainUIHandler.java | 7 - .../ui/actions/shared/AbstractContentUIAction.java | 31 ++++ .../swing/ui/actions/shared/AbstractUIAction.java | 97 ++++++++++--- .../ui/actions/shared/CancelCreateUIAction.java | 20 ++- .../ui/actions/shared/CloseAndCreateUIAction.java | 114 +++++++-------- .../swing/ui/actions/shared/CloseOpenUIAction.java | 158 +++++---------------- .../ui/actions/shared/DeleteDataUIAction.java | 11 +- .../ui/actions/shared/DeleteReferenceUIAction.java | 25 ++-- .../actions/shared/DeleteTableEntryUIAction.java | 28 ++++ .../swing/ui/actions/shared/GoDownUIAction.java | 5 +- .../swing/ui/actions/shared/GoUpUIAction.java | 5 +- .../shared/MoveActivityLonglinesUIAction.java | 62 ++++---- .../actions/shared/MoveActivitySeinesUIAction.java | 57 ++++---- .../ui/actions/shared/MoveRoutesUIAction.java | 5 +- .../swing/ui/actions/shared/MoveTripsUIAction.java | 5 +- .../ui/actions/shared/NewTableEntryUIAction.java | 29 ++++ .../swing/ui/actions/shared/ReOpenUIAction.java | 50 +++---- .../swing/ui/actions/shared/ResetEditUIAction.java | 16 +-- .../ui/actions/shared/ResetTableEntryUIAction.java | 39 +++++ .../swing/ui/actions/shared/SaveEditUIAction.java | 13 +- .../ui/actions/shared/SaveTableEntryUIAction.java | 39 +++++ .../ui/actions/shared/SelectNodeUIAction.java | 3 +- .../ui/actions/shared/SelectOpenNodeUIAction.java | 11 +- .../application/swing/ui/content/ContentUI.jaxx | 2 +- .../swing/ui/content/ContentUIBlockingLayerUI.java | 113 +++++++++++++++ .../swing/ui/content/ContentUIInitializer.java | 28 +--- .../swing/ui/content/ObserveActionMap.java | 74 ++++++++++ .../swing/ui/content/open/ContentOpenableUI.jcss | 4 + .../swing/ui/content/table/ContentTableUI.jaxx | 23 ++- .../swing/ui/content/table/ContentTableUI.jcss | 31 ++-- .../ui/content/table/ContentTableUIHandler.java | 3 + .../content/table/ContentTableUIInitializer.java | 9 +- 33 files changed, 726 insertions(+), 487 deletions(-) diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveSwingApplicationContext.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveSwingApplicationContext.java index 1ed8e6b..9162cbc 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveSwingApplicationContext.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveSwingApplicationContext.java @@ -28,24 +28,7 @@ import fr.ird.observe.application.swing.configuration.ObserveSwingApplicationCon import fr.ird.observe.application.swing.db.DataContext; import fr.ird.observe.application.swing.decoration.DecoratorService; import fr.ird.observe.application.swing.ui.ObserveMainUI; -import fr.ird.observe.application.swing.ui.actions.shared.AbstractUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.CancelCreateUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.CloseAndCreateUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.CloseOpenUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.DeleteDataUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.DeleteReferenceUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.GoDownUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.GoUpUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.MoveActivityLonglinesUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.MoveActivitySeinesUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.MoveRoutesUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.MoveTripLonglinesUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.MoveTripSeinesUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.ReOpenUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.ResetEditUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.SaveEditUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.SelectNodeUIAction; -import fr.ird.observe.application.swing.ui.actions.shared.SelectOpenNodeUIAction; +import fr.ird.observe.application.swing.ui.content.ObserveActionMap; import fr.ird.observe.application.swing.ui.content.ContentUIManager; import fr.ird.observe.application.swing.ui.content.ObserveFocusManager; import fr.ird.observe.application.swing.validation.ValidationContext; @@ -63,7 +46,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.h2.tools.Server; -import javax.swing.ActionMap; import java.io.Closeable; import java.io.IOException; import java.util.Arrays; @@ -131,7 +113,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im VALIDATION_CONTEXT("Validation context", ValidationContext.class), MAIN_UI("Main UI", ObserveMainUI.class), ACTIONS("Command line Actions", ObserveCLAction.class), - ACTION_MAP("UI Actions", ActionMap.class), + ACTION_MAP("UI Actions", ObserveActionMap.class), H2_SERVER_MODE("H2 Server mode", Boolean.class), H2_SERVER("H2 Server", Server.class), H2_WEBSERVER("H2 Web server", Server.class), @@ -184,13 +166,6 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im private boolean closed; /** - * Un drapeau pour activer sur les connections le support JMX. - * - * @since 2.2 - */ - private boolean useJMX; - - /** * Récupération du contexte applicatif. * * @return l'instance partagé du contexte. @@ -238,10 +213,6 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im // - Read //------------------------------------------- - public boolean isUseJMX() { - return useJMX; - } - /** * @return {@code true} si le context applicatif a été fermé (et est donc * passé dans la méthode {@link #close()}, {@code false} autrement. @@ -306,7 +277,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im return NODE_TO_RESELECT.get(); } - public ActionMap getActionMap() { + public ObserveActionMap getActionMap() { return ACTION_MAP.get(); } @@ -338,10 +309,6 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im // - Write //------------------------------------------- - public void setUseJMX(boolean useJMX) { - this.useJMX = useJMX; - } - public void setNodesToReselect(String[] paths) { if (paths == null) { NODE_TO_RESELECT.remove(); @@ -361,6 +328,12 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im public void setMainUI(ObserveMainUI ui) { MAIN_UI.set(ui); + + ObserveActionMap actionMap = new ObserveActionMap(ui); + ui.getRootPane().setActionMap(actionMap); + + ACTION_MAP.set(actionMap); + } public void removeMainUI() { @@ -371,34 +344,6 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im H2_SERVER_MODE.remove(); } - - public void registerShareActions() { - - ObserveMainUI ui = getMainUI(); - ActionMap actionMap = ui.getRootPane().getActionMap(); - - ACTION_MAP.set(actionMap); - - registerMainAction(actionMap, new SelectOpenNodeUIAction(ui)); - registerMainAction(actionMap, new SelectNodeUIAction(ui)); - registerMainAction(actionMap, new GoUpUIAction(ui)); - registerMainAction(actionMap, new GoDownUIAction(ui)); - registerMainAction(actionMap, new ReOpenUIAction(ui)); - registerMainAction(actionMap, new CloseOpenUIAction(ui)); - registerMainAction(actionMap, new CloseAndCreateUIAction(ui)); - registerMainAction(actionMap, new CancelCreateUIAction(ui)); - registerMainAction(actionMap, new ResetEditUIAction(ui)); - registerMainAction(actionMap, new SaveEditUIAction(ui)); - registerMainAction(actionMap, new DeleteDataUIAction(ui)); - registerMainAction(actionMap, new DeleteReferenceUIAction(ui)); - registerMainAction(actionMap, new MoveTripLonglinesUIAction(ui)); - registerMainAction(actionMap, new MoveTripSeinesUIAction(ui)); - registerMainAction(actionMap, new MoveRoutesUIAction(ui)); - registerMainAction(actionMap, new MoveActivitySeinesUIAction(ui)); - registerMainAction(actionMap, new MoveActivityLonglinesUIAction(ui)); - - } - //------------------------------------------- // - Locks //------------------------------------------- @@ -469,21 +414,12 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im super.finalize(); } - private void registerMainAction(ActionMap actionMap, AbstractUIAction action) { - String actionId = action.getActionId(); - if (log.isInfoEnabled()) { - log.info("Register UI action " + actionId); - } - actionMap.put(actionId, action); - } - -// private ObjectName createMBean(DataSource source) throws MalformedObjectNameException { -// Hashtable<String, String> tb = new Hashtable<String, String>(); -// tb.put("type", "statistics"); -// String name = source.getLabel(); -// tb.put("sessionFactory", name.replaceAll(":", "_")); -// // MBean object name -// ObjectName on = new ObjectName("hibernate", tb); -// return on; +// private void registerMainAction(ActionMap actionMap, AbstractUIAction action) { +// String actionId = action.getActionId(); +// if (log.isInfoEnabled()) { +// log.info("Register UI action " + actionId); +// } +// actionMap.put(actionId, action); // } + } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUIHandler.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUIHandler.java index b5e3d9c..f57b911 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUIHandler.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUIHandler.java @@ -242,13 +242,6 @@ public class ObserveMainUIHandler { // set fullscreen propery on main ui ui.getGraphicsConfiguration().getDevice().setFullScreenWindow(config.isFullScreen() ? ui : null); - // on enregistre les actions communes à toutes les écrans d'édition - // les bouttons utilisant ces actions seront automatiquement - // chargés (à partir des actions) lors de l'ouverture des ui - // et mis à jour - - context.registerShareActions(); - new ObserveNavigationTreeShowPopupAction(treeHelper, ui.getNavigationScrollPane(), ui.getNavigationPopup()); return ui; diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/AbstractContentUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/AbstractContentUIAction.java new file mode 100644 index 0000000..309f5eb --- /dev/null +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/AbstractContentUIAction.java @@ -0,0 +1,31 @@ +package fr.ird.observe.application.swing.ui.actions.shared; + +import fr.ird.observe.application.swing.ui.ObserveMainUI; +import fr.ird.observe.application.swing.ui.content.ContentUI; + +import java.awt.event.ActionEvent; + +/** + * Created on 10/11/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.1 + */ +public abstract class AbstractContentUIAction extends AbstractUIAction { + + + public AbstractContentUIAction(ObserveMainUI mainUI, String actionCommandKey, String label, String shortDescription, String actionIcon, String acceleratorKey) { + super(mainUI, actionCommandKey, label, shortDescription, actionIcon, acceleratorKey); + } + + protected abstract void actionPerformed(ContentUI<?, ?> contentUI); + + @Override + public final void actionPerformed(ActionEvent e) { + if (!canExecuteAction(e)) { + return; + } + ContentUI<?, ?> contentUI = getContentUI(e); + actionPerformed(contentUI); + } +} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/AbstractUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/AbstractUIAction.java index ea9f4cd..99fa5f1 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/AbstractUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/AbstractUIAction.java @@ -27,6 +27,8 @@ import fr.ird.observe.application.swing.ui.content.ContentUI; import fr.ird.observe.application.swing.ui.tree.ObserveTreeHelper; import fr.ird.observe.application.swing.ui.tree.node.ObserveNode; import jaxx.runtime.SwingUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import javax.swing.AbstractAction; import javax.swing.AbstractButton; @@ -34,6 +36,7 @@ import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JPopupMenu; import javax.swing.JTree; +import javax.swing.KeyStroke; import javax.swing.tree.TreePath; import java.awt.event.ActionEvent; import java.util.Objects; @@ -50,42 +53,80 @@ public abstract class AbstractUIAction extends AbstractAction { private static final long serialVersionUID = 1L; - private final ObserveMainUI mainUI; + /** Logger */ + private static final Log log = LogFactory.getLog(AbstractUIAction.class); + + public static final String EDITOR = "editor"; - private final String actionId; + private final ObserveMainUI mainUI; public AbstractUIAction(ObserveMainUI mainUI, - String actionId, + String actionCommandKey, String label, String shortDescription, - String actionIcon) { + String actionIcon, + String acceleratorKey) { super(t(label), SwingUtil.getUIManagerActionIcon(actionIcon)); - this.actionId = actionId; + putValue(ACTION_COMMAND_KEY, actionCommandKey); this.mainUI = mainUI; - putValue(SHORT_DESCRIPTION, t(shortDescription)); + if (acceleratorKey != null) { + + KeyStroke keyStroke = KeyStroke.getKeyStroke(acceleratorKey); + Objects.requireNonNull(keyStroke, "KeyStroke invalide: " + acceleratorKey); + putValue(ACCELERATOR_KEY, keyStroke); + + String acceleratorStr = " (" + keyStroke.toString().replace(" pressed ", " + ") + ")"; + + putValue(NAME, t(label) + acceleratorStr); + putValue(SHORT_DESCRIPTION, t(shortDescription) + acceleratorStr); + } else { + + putValue(SHORT_DESCRIPTION, t(shortDescription)); + } } - public ObserveMainUI getMainUI() { - return mainUI; + public KeyStroke getAcceleratorKey() { + return (KeyStroke) getValue(ACCELERATOR_KEY); } - public String getActionId() { - return actionId; + public String getActionCommandKey() { + return (String) getValue(ACTION_COMMAND_KEY); + } + + public ObserveMainUI getMainUI() { + return mainUI; } public void initAction(ContentUI<?, ?> ui, AbstractButton editor) { editor.setAction(this); - editor.putClientProperty("mainUI", mainUI); + editor.putClientProperty("ui", ui); + putValue(EDITOR, editor); + KeyStroke keyStroke = getAcceleratorKey(); + if (keyStroke != null) { + String actionCommandKey = getActionCommandKey(); +// ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(keyStroke, actionCommandKey); + ui.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, actionCommandKey); + ui.getActionMap().put(actionCommandKey, this); + } } public void updateAction(ContentUI<?, ?> ui, AbstractButton editor) { - editor.putClientProperty("ui", ui); String tip = (String) editor.getClientProperty("toolTipText"); if (tip != null) { + KeyStroke keyStroke = getAcceleratorKey(); + if (keyStroke != null) { + String acceleratorStr = " (" + keyStroke.toString().replace(" pressed ", " + ") + ")"; + tip += acceleratorStr; + } editor.setToolTipText(tip); } String text = (String) editor.getClientProperty("text"); if (text != null) { + KeyStroke keyStroke = getAcceleratorKey(); + if (keyStroke != null) { + String acceleratorStr = " (" + keyStroke.toString().replace(" pressed ", " + ") + ")"; + text += acceleratorStr; + } editor.setText(text); } String actionIcon = (String) editor.getClientProperty("actionIcon"); @@ -95,9 +136,23 @@ public abstract class AbstractUIAction extends AbstractAction { } } - public static boolean isOpenActivityNodeCollapsed(JTree tree, - ObserveTreeHelper treeHelper, - DataContext dataContext) { + + protected boolean canExecuteAction(ActionEvent e) { + JComponent editor = getEditor(); + if (!(editor.isVisible() && editor.isEnabled())) { + if (log.isInfoEnabled()) { + log.info("Disabled action: " + getActionCommandKey() + " :: " + this); + } + return false; + } + return true; + } + + private JComponent getEditor() { + return (JComponent) getValue(EDITOR); + } + + public static boolean isOpenActivityNodeCollapsed(JTree tree, ObserveTreeHelper treeHelper, DataContext dataContext) { // on regarde si le noeud de l'activity ouverte est collapsé @@ -114,10 +169,17 @@ public abstract class AbstractUIAction extends AbstractAction { return tree.isCollapsed(activityPath); } - protected ContentUI<?, ?> getContentUI(ActionEvent e) { JComponent c = (JComponent) e.getSource(); - ContentUI<?, ?> ui = (ContentUI<?, ?>) c.getClientProperty("ui"); + ContentUI<?, ?> ui; + + if (c instanceof ContentUI) { + ui = (ContentUI<?, ?>) c; + } else if (c.getParent() instanceof ContentUI) { + ui = (ContentUI<?, ?>) c.getParent(); + } else { + ui = (ContentUI<?, ?>) c.getClientProperty("ui"); + } Objects.requireNonNull(ui, "could not find client property ui on component" + c); return ui; } @@ -128,5 +190,4 @@ public abstract class AbstractUIAction extends AbstractAction { Objects.requireNonNull(ui, "could not find client property popup on component" + c); return ui; } - } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CancelCreateUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CancelCreateUIAction.java index 3bf739c..5fa99df 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CancelCreateUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CancelCreateUIAction.java @@ -25,9 +25,6 @@ import fr.ird.observe.application.swing.ui.ObserveMainUI; import fr.ird.observe.application.swing.ui.content.ContentUI; import fr.ird.observe.application.swing.ui.tree.node.ObserveNode; -import javax.swing.SwingUtilities; -import java.awt.event.ActionEvent; - import static org.nuiton.i18n.I18n.n; /** @@ -37,7 +34,7 @@ import static org.nuiton.i18n.I18n.n; * @author Tony Chemit - chemit@codelutin.com * @since 1.4 */ -public class CancelCreateUIAction extends AbstractUIAction { +public class CancelCreateUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -48,17 +45,16 @@ public class CancelCreateUIAction extends AbstractUIAction { ACTION_NAME, n("observe.action.cancel"), n("observe.action.cancel.create.tip"), - "cancel" + "cancel", + "ctrl pressed R" ); } @Override - public void actionPerformed(final ActionEvent e) { - SwingUtilities.invokeLater(() -> { - ContentUI<?, ?> ui = getContentUI(e); - ui.stopEdit(); - ObserveNode parentNode = ui.getTreeHelper().removeNode(ui.getTreeHelper().getSelectedNode()); - ui.getTreeHelper().selectNode(parentNode); - }); + protected void actionPerformed(ContentUI<?, ?> ui) { + ui.stopEdit(); + ObserveNode parentNode = ui.getTreeHelper().removeNode(ui.getTreeHelper().getSelectedNode()); + ui.getTreeHelper().selectNode(parentNode); } + } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CloseAndCreateUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CloseAndCreateUIAction.java index f26a4af..90b9118 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CloseAndCreateUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CloseAndCreateUIAction.java @@ -34,9 +34,7 @@ import fr.ird.observe.services.dto.longline.ActivityLonglineDto; import fr.ird.observe.services.dto.seine.ActivitySeineDto; import javax.swing.JTree; -import javax.swing.SwingUtilities; import javax.swing.tree.TreePath; -import java.awt.event.ActionEvent; import static org.nuiton.i18n.I18n.n; @@ -46,7 +44,7 @@ import static org.nuiton.i18n.I18n.n; * @author Tony Chemit - chemit@codelutin.com * @since 1.5 */ -public class CloseAndCreateUIAction extends AbstractUIAction { +public class CloseAndCreateUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -57,90 +55,88 @@ public class CloseAndCreateUIAction extends AbstractUIAction { ACTION_NAME, n("observe.content.action.closeAndCreate"), n("observe.content.action.closeAndCreate.tip"), - "add" + "add", + "ctrl pressed N" ); } @Override - public void actionPerformed(final ActionEvent e) { + protected void actionPerformed(ContentUI<?, ?> ui) { - SwingUtilities.invokeLater(() -> { - ContentUI<?, ?> ui = getContentUI(e); + if (ui instanceof ContentOpenableUI) { + ((ContentOpenableUI<?, ?>) ui).closeAndCreateData(); + return; + } - if (ui instanceof ContentOpenableUI) { - ((ContentOpenableUI<?, ?>) ui).closeAndCreateData(); - return; - } - - if (ui instanceof ActivitySeinesUI) { - - // cas particulier pour l'écran des activitys + if (ui instanceof ActivitySeinesUI) { - JTree tree = getMainUI().getNavigation(); - ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); + // cas particulier pour l'écran des activitys - boolean wasCollapsed = isOpenActivityNodeCollapsed(tree, treeHelper, getMainUI().getDataContext()); + JTree tree = getMainUI().getNavigation(); + ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); - // selection du noeud de l'activity ouverte - treeHelper.selectOpenNode(ActivitySeineDto.class); + boolean wasCollapsed = isOpenActivityNodeCollapsed(tree, treeHelper, getMainUI().getDataContext()); - // on conserve le path de l'activity - TreePath path = tree.getSelectionPath(); + // selection du noeud de l'activity ouverte + treeHelper.selectOpenNode(ActivitySeineDto.class); - // recuperation de l'écran associé - ActivitySeineUI selectedUI = (ActivitySeineUI) - ObserveSwingApplicationContext.get().getContentUIManager().getSelectedContentUI(); + // on conserve le path de l'activity + TreePath path = tree.getSelectionPath(); - // fermeture de l'activity et création d'une nouvelle - selectedUI.closeAndCreateData(); + // recuperation de l'écran associé + ActivitySeineUI selectedUI = (ActivitySeineUI) + ObserveSwingApplicationContext.get().getContentUIManager().getSelectedContentUI(); - if (wasCollapsed) { + // fermeture de l'activity et création d'une nouvelle + selectedUI.closeAndCreateData(); - // on ferme le noeud de l'activity (qui a ete ouvert - // lors de la selection de celle-ci) - tree.collapsePath(path); - } + if (wasCollapsed) { - return; + // on ferme le noeud de l'activity (qui a ete ouvert + // lors de la selection de celle-ci) + tree.collapsePath(path); } - if (ui instanceof ActivityLonglinesUI) { + return; + } - // cas particulier pour l'écran des activitys + if (ui instanceof ActivityLonglinesUI) { - JTree tree = getMainUI().getNavigation(); - ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); + // cas particulier pour l'écran des activitys - boolean wasCollapsed = isOpenActivityNodeCollapsed( - tree, - treeHelper, - getMainUI().getDataContext() - ); + JTree tree = getMainUI().getNavigation(); + ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); - // selection du noeud de l'activity ouverte - treeHelper.selectOpenNode(ActivityLonglineDto.class); + boolean wasCollapsed = isOpenActivityNodeCollapsed( + tree, + treeHelper, + getMainUI().getDataContext() + ); - // on conserve le path de l'activity - TreePath path = tree.getSelectionPath(); + // selection du noeud de l'activity ouverte + treeHelper.selectOpenNode(ActivityLonglineDto.class); - // recuperation de l'écran associé - ActivityLonglineUI selectedUI = (ActivityLonglineUI) - ObserveSwingApplicationContext.get().getContentUIManager().getSelectedContentUI(); + // on conserve le path de l'activity + TreePath path = tree.getSelectionPath(); - // fermeture de l'activity et création d'une nouvelle - selectedUI.closeAndCreateData(); + // recuperation de l'écran associé + ActivityLonglineUI selectedUI = (ActivityLonglineUI) + ObserveSwingApplicationContext.get().getContentUIManager().getSelectedContentUI(); - if (wasCollapsed) { + // fermeture de l'activity et création d'une nouvelle + selectedUI.closeAndCreateData(); - // on ferme le noeud de l'activity (qui a ete ouvert - // lors de la selection de celle-ci) - tree.collapsePath(path); - } + if (wasCollapsed) { - return; + // on ferme le noeud de l'activity (qui a ete ouvert + // lors de la selection de celle-ci) + tree.collapsePath(path); } - throw new IllegalStateException("Can not come here!"); - }); + return; + } + + throw new IllegalStateException("Can not come here!"); } + } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CloseOpenUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CloseOpenUIAction.java index fbdab1d..dd838ac 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CloseOpenUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/CloseOpenUIAction.java @@ -34,7 +34,6 @@ import fr.ird.observe.application.swing.ui.tree.ObserveTreeHelper; import fr.ird.observe.application.swing.ui.tree.node.ObserveNode; import javax.swing.SwingUtilities; -import java.awt.event.ActionEvent; import static org.nuiton.i18n.I18n.n; @@ -44,7 +43,7 @@ import static org.nuiton.i18n.I18n.n; * @author Tony Chemit - chemit@codelutin.com * @since 1.4 */ -public class CloseOpenUIAction extends AbstractUIAction { +public class CloseOpenUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -55,127 +54,48 @@ public class CloseOpenUIAction extends AbstractUIAction { ACTION_NAME, n("observe.action.close.open"), n("observe.action.close.open.tip"), - "close" + "close", + "ctrl pressed C" ); } @Override - public void actionPerformed(final ActionEvent e) { - - SwingUtilities.invokeLater(() -> { - ContentUI<?, ?> ui = getContentUI(e); - - if (ui instanceof ContentOpenableUI) { - ((ContentOpenableUI<?, ?>) ui).closeData(); - return; - } - - ObserveSwingApplicationContext applicationContext = ObserveSwingApplicationContext.get(); - - if (ui instanceof TripSeinesUI) { - String higherOpenId = applicationContext.getDataContext().getOpenTripSeineId(); - closeData(applicationContext, ui, higherOpenId); - return; - } - if (ui instanceof RoutesUI) { - String higherOpenId = applicationContext.getDataContext().getOpenRouteId(); - closeData(applicationContext, ui, higherOpenId); - return; - } - if (ui instanceof ActivitySeinesUI) { - String higherOpenId = applicationContext.getDataContext().getOpenActivitySeineId(); - closeData(applicationContext, ui, higherOpenId); - return; - } - - if (ui instanceof TripLonglinesUI) { - String higherOpenId = applicationContext.getDataContext().getOpenTripLonglineId(); - closeData(applicationContext, ui, higherOpenId); - return; - } - if (ui instanceof ActivityLonglinesUI) { - String higherOpenId = applicationContext.getDataContext().getOpenActivityLonglineId(); - closeData(applicationContext, ui, higherOpenId); - return; - } - -// if (ui instanceof ActivitySeinesUI) { -// -// // cas particulier pour l'écran des activités -// -// JTree tree = getMainUI().getNavigation(); -// ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); -// -// // recuperation du noeud courant (activitys) -// ObserveNode node = treeHelper.getSelectedNode(); -// -// boolean wasCollapsed = isOpenActivityNodeCollapsed(tree, treeHelper, getMainUI().getDataContext()); -// -// // selection du noeud de l'activity ouverte -// treeHelper.selectOpenNode(ActivitySeineDto.class); -// -// // on conserve le path de l'activity -// TreePath path = tree.getSelectionPath(); -// -// // recuperation de l'écran associé -// ActivitySeineUI selectedUI = (ActivitySeineUI) -// applicationContext.getContentUIManager().getSelectedContentUI(); -// -// // fermeture de l'activity -// selectedUI.closeData(); -// -// if (wasCollapsed) { -// -// // on ferme le noeud de l'activity (qui a ete ouvert -// // lors de la selection de celle-ci) -// tree.collapsePath(path); -// } -// -// // retour sur le noeud des activitys -// treeHelper.selectNode(node); -// -// return; -// } -// -// if (ui instanceof ActivityLonglinesUI) { -// -// // cas particulier pour l'écran des activités -// -// JTree tree = getMainUI().getNavigation(); -// ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); -// -// // recuperation du noeud courant (activitys) -// ObserveNode node = treeHelper.getSelectedNode(); -// -// boolean wasCollapsed = isOpenActivityNodeCollapsed(tree, treeHelper, getMainUI().getDataContext()); -// -// // selection du noeud de l'activity ouverte -// treeHelper.selectOpenNode(ActivityLonglineDto.class); -// -// // on conserve le path de l'activité -// TreePath path = tree.getSelectionPath(); -// -// // recuperation de l'écran associé -// ActivityLonglineUI selectedUI = (ActivityLonglineUI) -// applicationContext.getContentUIManager().getSelectedContentUI(); -// -// // fermeture de l'activité -// selectedUI.closeData(); -// -// if (wasCollapsed) { -// -// // on ferme le noeud de l'activité (qui a ete ouvert lors de la selection de celle-ci) -// tree.collapsePath(path); -// } -// -// // retour sur le noeud des activités -// treeHelper.selectNode(node); -// -// return; -// } - - throw new IllegalStateException("Can not come here!"); - }); + protected void actionPerformed(ContentUI<?, ?> ui) { + if (ui instanceof ContentOpenableUI) { + ((ContentOpenableUI<?, ?>) ui).closeData(); + return; + } + + ObserveSwingApplicationContext applicationContext = ObserveSwingApplicationContext.get(); + + if (ui instanceof TripSeinesUI) { + String higherOpenId = applicationContext.getDataContext().getOpenTripSeineId(); + closeData(applicationContext, ui, higherOpenId); + return; + } + if (ui instanceof RoutesUI) { + String higherOpenId = applicationContext.getDataContext().getOpenRouteId(); + closeData(applicationContext, ui, higherOpenId); + return; + } + if (ui instanceof ActivitySeinesUI) { + String higherOpenId = applicationContext.getDataContext().getOpenActivitySeineId(); + closeData(applicationContext, ui, higherOpenId); + return; + } + + if (ui instanceof TripLonglinesUI) { + String higherOpenId = applicationContext.getDataContext().getOpenTripLonglineId(); + closeData(applicationContext, ui, higherOpenId); + return; + } + if (ui instanceof ActivityLonglinesUI) { + String higherOpenId = applicationContext.getDataContext().getOpenActivityLonglineId(); + closeData(applicationContext, ui, higherOpenId); + return; + } + + throw new IllegalStateException("Can not come here!"); } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteDataUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteDataUIAction.java index 9f49e16..29f16b0 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteDataUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteDataUIAction.java @@ -25,7 +25,6 @@ import fr.ird.observe.application.swing.ui.ObserveMainUI; import fr.ird.observe.application.swing.ui.content.ContentUI; import javax.swing.SwingUtilities; -import java.awt.event.ActionEvent; import static org.nuiton.i18n.I18n.n; @@ -36,7 +35,7 @@ import static org.nuiton.i18n.I18n.n; * @author Tony Chemit - chemit@codelutin.com * @since 1.4 */ -public class DeleteDataUIAction extends AbstractUIAction { +public class DeleteDataUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -47,23 +46,23 @@ public class DeleteDataUIAction extends AbstractUIAction { ACTION_NAME, n("observe.action.delete"), n("observe.action.delete.tip"), - "delete" + "delete", + "ctrl pressed X" ); } @Override - public void actionPerformed(final ActionEvent e) { - + protected void actionPerformed(ContentUI<?, ?> contentUI) { getMainUI().setBusy(true); SwingUtilities.invokeLater(() -> { try { - ContentUI<?, ?> contentUI = getContentUI(e); contentUI.delete(); } finally { getMainUI().setBusy(false); } }); + } } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteReferenceUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteReferenceUIAction.java index 4733b95..6d1eac7 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteReferenceUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteReferenceUIAction.java @@ -24,9 +24,6 @@ package fr.ird.observe.application.swing.ui.actions.shared; import fr.ird.observe.application.swing.ui.ObserveMainUI; import fr.ird.observe.application.swing.ui.content.ContentUI; -import javax.swing.SwingUtilities; -import java.awt.event.ActionEvent; - import static org.nuiton.i18n.I18n.n; /** @@ -36,7 +33,7 @@ import static org.nuiton.i18n.I18n.n; * @author Tony Chemit - chemit@codelutin.com * @since 1.4 */ -public class DeleteReferenceUIAction extends AbstractUIAction { +public class DeleteReferenceUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -47,19 +44,19 @@ public class DeleteReferenceUIAction extends AbstractUIAction { ACTION_NAME, n("observe.action.delete"), n("observe.action.delete.tip"), - "delete" + "delete", + "ctrl pressed X" ); } @Override - public void actionPerformed(final ActionEvent e) { - SwingUtilities.invokeLater(() -> { - try { - ContentUI<?, ?> ui = getContentUI(e); - ui.delete(); - } finally { - getMainUI().setBusy(false); - } - }); + protected void actionPerformed(ContentUI<?, ?> ui) { + getMainUI().setBusy(true); + try { + ui.delete(); + } finally { + getMainUI().setBusy(false); + } } + } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteTableEntryUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteTableEntryUIAction.java new file mode 100644 index 0000000..ab78e22 --- /dev/null +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/DeleteTableEntryUIAction.java @@ -0,0 +1,28 @@ +package fr.ird.observe.application.swing.ui.actions.shared; + +import fr.ird.observe.application.swing.ui.ObserveMainUI; +import fr.ird.observe.application.swing.ui.content.ContentUI; +import fr.ird.observe.application.swing.ui.content.table.ContentTableUI; + +/** + * Created on 10/11/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.1 + */ +public class DeleteTableEntryUIAction extends AbstractContentUIAction { + + public static final String ACTION_NAME = "deleteTableEntry"; + + public DeleteTableEntryUIAction(ObserveMainUI mainUI) { + super(mainUI, ACTION_NAME, "", "", "delete", "ctrl pressed X"); + } + + @Override + protected void actionPerformed(ContentUI<?, ?> ui) { + + ContentTableUI<?, ?, ?> contentUI = (ContentTableUI<?, ?, ?>) ui; + contentUI.getHandler().removeSelectedRow(contentUI.getTableModel().getSelectedRow()); + + } +} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/GoDownUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/GoDownUIAction.java index 7fa5a03..4220ac5 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/GoDownUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/GoDownUIAction.java @@ -58,12 +58,13 @@ public class GoDownUIAction extends AbstractUIAction { ACTION_NAME, n("observe.action.goDown"), n("observe.action.goDown.tip"), - "go-down" + "go-down", + null ); } @Override - public void actionPerformed(final ActionEvent e) { + public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(() -> { JComponent c = (JComponent) e.getSource(); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/GoUpUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/GoUpUIAction.java index 13624d4..db7b648 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/GoUpUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/GoUpUIAction.java @@ -59,12 +59,13 @@ public class GoUpUIAction extends AbstractUIAction { ACTION_NAME, n("observe.action.goUp"), n("observe.action.goUp.tip"), - "go-up" + "go-up", + null ); } @Override - public void actionPerformed(final ActionEvent e) { + public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(() -> { JComponent c = (JComponent) e.getSource(); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveActivityLonglinesUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveActivityLonglinesUIAction.java index 7976691..796ec5f 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveActivityLonglinesUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveActivityLonglinesUIAction.java @@ -40,8 +40,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; -import java.awt.event.ActionEvent; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -55,7 +53,7 @@ import static org.nuiton.i18n.I18n.t; * @author Kevin Morin (Code Lutin) * @since 5.0 */ -public class MoveActivityLonglinesUIAction extends AbstractUIAction { +public class MoveActivityLonglinesUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -71,48 +69,44 @@ public class MoveActivityLonglinesUIAction extends AbstractUIAction { ACTION_NAME, n("observe.content.action.move.activities.longline"), n("observe.content.action.move.activities.longline.tip"), - "move-activities" + "move-activities", + null ); } @Override - public void actionPerformed(final ActionEvent e) { - - SwingUtilities.invokeLater(() -> { - ContentUI<?, ?> ui = getContentUI(e); - if (!(ui instanceof ActivityLonglinesUI)) { - throw new IllegalStateException("Can not come here!"); - } - ActivityLonglinesUI activityLonglinesUI = (ActivityLonglinesUI) ui; - + protected void actionPerformed(ContentUI<?, ?> ui) { + if (!(ui instanceof ActivityLonglinesUI)) { + throw new IllegalStateException("Can not come here!"); + } + ActivityLonglinesUI activityLonglinesUI = (ActivityLonglinesUI) ui; - // get current triplongline id - ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); - ObserveNode oldActivitiesNode = treeHelper.getSelectedNode(); - ObserveNode oldTripLonglineNode = oldActivitiesNode.getParent(); - // choose the new tripLongline - String tripLonglineId = chooseNewTripLongline(ui, oldTripLonglineNode); + // get current triplongline id + ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); + ObserveNode oldActivitiesNode = treeHelper.getSelectedNode(); + ObserveNode oldTripLonglineNode = oldActivitiesNode.getParent(); - if (tripLonglineId != null) { + // choose the new tripLongline + String tripLonglineId = chooseNewTripLongline(ui, oldTripLonglineNode); - if (log.isInfoEnabled()) { - log.info("Will move activities to trip: " + tripLonglineId); - } - // change the tripLongline of the selected activities - List<DataReference<ActivityLonglineDto>> selectedDatas = activityLonglinesUI.getModel().getSelectedDatas(); - List<String> activityIds = selectedDatas.stream() - .map(DataReference.ID_FUNCTION) - .collect(Collectors.toList()); - ActivityLonglineService service = ObserveSwingApplicationContext.get().getMainDataSourceServicesProvider().newActivityLonglineService(); -// List<Integer> positions = - service.moveActivityLonglinesToTripLongline(activityIds, tripLonglineId); + if (tripLonglineId != null) { - // update the tree - updateTree(oldActivitiesNode, tripLonglineId, activityIds); + if (log.isInfoEnabled()) { + log.info("Will move activities to trip: " + tripLonglineId); } + // change the tripLongline of the selected activities + List<DataReference<ActivityLonglineDto>> selectedDatas = activityLonglinesUI.getModel().getSelectedDatas(); + List<String> activityIds = selectedDatas.stream() + .map(DataReference.ID_FUNCTION) + .collect(Collectors.toList()); + ActivityLonglineService service = ObserveSwingApplicationContext.get().getMainDataSourceServicesProvider().newActivityLonglineService(); +// List<Integer> positions = + service.moveActivityLonglinesToTripLongline(activityIds, tripLonglineId); - }); + // update the tree + updateTree(oldActivitiesNode, tripLonglineId, activityIds); + } } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveActivitySeinesUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveActivitySeinesUIAction.java index 622cff2..dca5e7d 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveActivitySeinesUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveActivitySeinesUIAction.java @@ -39,8 +39,6 @@ import fr.ird.observe.services.dto.seine.RouteDto; import fr.ird.observe.services.service.data.seine.ActivitySeineService; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; -import java.awt.event.ActionEvent; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -54,7 +52,7 @@ import static org.nuiton.i18n.I18n.t; * @author Kevin Morin (Code Lutin) * @since 5.0 */ -public class MoveActivitySeinesUIAction extends AbstractUIAction { +public class MoveActivitySeinesUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -65,42 +63,39 @@ public class MoveActivitySeinesUIAction extends AbstractUIAction { ACTION_NAME, n("observe.content.action.move.activities.seine"), n("observe.content.action.move.activities.seine.tip"), - "move-activities" + "move-activities", + null ); } @Override - public void actionPerformed(final ActionEvent e) { + protected void actionPerformed(ContentUI<?, ?> ui) { - SwingUtilities.invokeLater(() -> { - ContentUI<?, ?> ui = getContentUI(e); - if (!(ui instanceof ActivitySeinesUI)) { - throw new IllegalStateException("Can not come here!"); - } + if (!(ui instanceof ActivitySeinesUI)) { + throw new IllegalStateException("Can not come here!"); + } - // get current route id - ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); - ObserveNode oldActivitiesNode = treeHelper.getSelectedNode(); - ObserveNode oldRouteNode = oldActivitiesNode.getParent(); - - // choose the new route - String routeId = chooseNewRoute(ui, oldRouteNode); - - if (routeId != null) { - // change the route of the selected activities - List<DataReference<ActivitySeineDto>> selectedDatas = ((ActivitySeinesUIModel) ui.getModel()).getSelectedDatas(); - List<String> activityIds = selectedDatas.stream() - .map(DataReference.ID_FUNCTION) - .collect(Collectors.toList()); - ActivitySeineService service = ObserveSwingApplicationContext.get().getMainDataSourceServicesProvider().newActivitySeineService(); - List<Integer> positions = service.moveActivitySeinesToRoute(activityIds, routeId); - - // update the tree - updateTree(oldActivitiesNode, routeId, activityIds); - } + // get current route id + ObserveTreeHelper treeHelper = getMainUI().getTreeHelper(); + ObserveNode oldActivitiesNode = treeHelper.getSelectedNode(); + ObserveNode oldRouteNode = oldActivitiesNode.getParent(); + + // choose the new route + String routeId = chooseNewRoute(ui, oldRouteNode); - }); + if (routeId != null) { + // change the route of the selected activities + List<DataReference<ActivitySeineDto>> selectedDatas = ((ActivitySeinesUIModel) ui.getModel()).getSelectedDatas(); + List<String> activityIds = selectedDatas.stream() + .map(DataReference.ID_FUNCTION) + .collect(Collectors.toList()); + ActivitySeineService service = ObserveSwingApplicationContext.get().getMainDataSourceServicesProvider().newActivitySeineService(); + List<Integer> positions = service.moveActivitySeinesToRoute(activityIds, routeId); + + // update the tree + updateTree(oldActivitiesNode, routeId, activityIds); + } } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveRoutesUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveRoutesUIAction.java index 8fd275b..e2bdf49 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveRoutesUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveRoutesUIAction.java @@ -65,12 +65,13 @@ public class MoveRoutesUIAction extends AbstractUIAction { ACTION_NAME, n("observe.content.action.move.routes"), n("observe.content.action.move.routes.tip"), - "move-routes" + "move-routes", + null ); } @Override - public void actionPerformed(final ActionEvent e) { + public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(() -> { JComponent c = (JComponent) e.getSource(); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveTripsUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveTripsUIAction.java index e118785..043fb8d 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveTripsUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/MoveTripsUIAction.java @@ -68,12 +68,13 @@ public abstract class MoveTripsUIAction<T extends DataDto> extends AbstractUIAct actionName, n("observe.content.action.move.trips"), n("observe.content.action.move.trips.tip"), - "move-trips" + "move-trips", + null ); } @Override - public void actionPerformed(final ActionEvent e) { + public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(() -> { diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/NewTableEntryUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/NewTableEntryUIAction.java new file mode 100644 index 0000000..f0e129c --- /dev/null +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/NewTableEntryUIAction.java @@ -0,0 +1,29 @@ +package fr.ird.observe.application.swing.ui.actions.shared; + +import fr.ird.observe.application.swing.ui.ObserveMainUI; +import fr.ird.observe.application.swing.ui.content.ContentUI; +import fr.ird.observe.application.swing.ui.content.table.ContentTableUI; + +/** + * Created on 10/11/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.1 + */ +public class NewTableEntryUIAction extends AbstractContentUIAction { + + + public static final String ACTION_NAME = "newTableEntry"; + + public NewTableEntryUIAction(ObserveMainUI mainUI) { + super(mainUI, ACTION_NAME, "", "", "add", "ctrl pressed N"); + } + + @Override + protected void actionPerformed(ContentUI<?, ?> ui) { + ContentTableUI<?, ?, ?> contentUI = (ContentTableUI<?, ?, ?>) ui; + contentUI.getTableModel().addNewEntry(); + + } + +} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ReOpenUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ReOpenUIAction.java index 0a8a161..b122bf9 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ReOpenUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ReOpenUIAction.java @@ -30,9 +30,6 @@ import fr.ird.observe.application.swing.ui.tree.ObserveTreeHelper; import fr.ird.observe.application.swing.ui.tree.node.ObserveNode; import fr.ird.observe.services.dto.DataReference; -import javax.swing.SwingUtilities; -import java.awt.event.ActionEvent; - import static org.nuiton.i18n.I18n.n; /** @@ -42,7 +39,7 @@ import static org.nuiton.i18n.I18n.n; * @author Tony Chemit - chemit@codelutin.com * @since 1.4 */ -public class ReOpenUIAction extends AbstractUIAction { +public class ReOpenUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -53,42 +50,41 @@ public class ReOpenUIAction extends AbstractUIAction { ACTION_NAME, n("observe.content.action.reopen"), n("observe.content.action.reopen.tip"), - "reopen" + "reopen", + "ctrl pressed O" ); } @Override - public void actionPerformed(final ActionEvent e) { - SwingUtilities.invokeLater(() -> { - ContentUI<?, ?> ui = getContentUI(e); + protected void actionPerformed(ContentUI<?, ?> ui) { - ContentOpenableUI<?, ?> openUI; + ContentOpenableUI<?, ?> openUI; - if (ui instanceof ContentOpenableUI<?, ?>) { + if (ui instanceof ContentOpenableUI<?, ?>) { - openUI = (ContentOpenableUI<?, ?>) ui; - } else if (ui instanceof ContentListUI<?, ?, ?>) { + openUI = (ContentOpenableUI<?, ?>) ui; + } else if (ui instanceof ContentListUI<?, ?, ?>) { - DataReference<?> selectedData = ((ContentListUI<?, ?, ?>) ui).getSelectedData(); + DataReference<?> selectedData = ((ContentListUI<?, ?, ?>) ui).getSelectedData(); - String id = selectedData.getId(); + String id = selectedData.getId(); - ObserveTreeHelper treeHelper = ui.getTreeHelper(); - ObserveNode selectedNode = treeHelper.getSelectedNode(); - ObserveNode node = treeHelper.findNode(selectedNode, id); + ObserveTreeHelper treeHelper = ui.getTreeHelper(); + ObserveNode selectedNode = treeHelper.getSelectedNode(); + ObserveNode node = treeHelper.findNode(selectedNode, id); - treeHelper.selectNode(node); + treeHelper.selectNode(node); - openUI = (ContentOpenableUI<?, ?>) - ObserveSwingApplicationContext.get().getContentUIManager().getSelectedContentUI(); + openUI = (ContentOpenableUI<?, ?>) + ObserveSwingApplicationContext.get().getContentUIManager().getSelectedContentUI(); - } else { - throw new IllegalStateException("The action " + ACTION_NAME + " can not be executed from ui " + ui); - } + } else { + throw new IllegalStateException("The action " + ACTION_NAME + " can not be executed from ui " + ui); + } - if (openUI != null) { - openUI.openData(); - } - }); + if (openUI != null) { + openUI.openData(); + } } + } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ResetEditUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ResetEditUIAction.java index 274ee60..da7a884 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ResetEditUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ResetEditUIAction.java @@ -24,9 +24,6 @@ package fr.ird.observe.application.swing.ui.actions.shared; import fr.ird.observe.application.swing.ui.ObserveMainUI; import fr.ird.observe.application.swing.ui.content.ContentUI; -import javax.swing.SwingUtilities; -import java.awt.event.ActionEvent; - import static org.nuiton.i18n.I18n.n; /** @@ -36,7 +33,7 @@ import static org.nuiton.i18n.I18n.n; * @author Tony Chemit - chemit@codelutin.com * @since 1.4 */ -public class ResetEditUIAction extends AbstractUIAction { +public class ResetEditUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -47,15 +44,14 @@ public class ResetEditUIAction extends AbstractUIAction { ACTION_NAME, n("observe.content.action.reset"), n("observe.content.action.reset.tip"), - "revert" + "revert", + "ctrl pressed R" ); } @Override - public void actionPerformed(final ActionEvent e) { - SwingUtilities.invokeLater(() -> { - ContentUI<?, ?> contentUI = getContentUI(e); - contentUI.resetEdit(); - }); + protected void actionPerformed(ContentUI<?, ?> contentUI) { + contentUI.resetEdit(); } + } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ResetTableEntryUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ResetTableEntryUIAction.java new file mode 100644 index 0000000..a0c8bdd --- /dev/null +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/ResetTableEntryUIAction.java @@ -0,0 +1,39 @@ +package fr.ird.observe.application.swing.ui.actions.shared; + +import fr.ird.observe.application.swing.ui.ObserveMainUI; +import fr.ird.observe.application.swing.ui.content.ContentUI; +import fr.ird.observe.application.swing.ui.content.table.ContentTableUI; + +/** + * Created on 10/11/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.1 + */ +public class ResetTableEntryUIAction extends AbstractContentUIAction { + + public static final String ACTION_NAME = "resetTableEntry"; + + public ResetTableEntryUIAction(ObserveMainUI mainUI) { + super(mainUI, ACTION_NAME, "", "", "revert", "ctrl shift pressed R"); + } + + @Override + protected void actionPerformed(ContentUI<?, ?> ui) { + + ContentTableUI<?, ?, ?> contentUI = (ContentTableUI<?, ?, ?>) ui; + + if (contentUI.getTableModel().isCreate()) { + + // reset new entry + contentUI.getTableModel().doRemoveRow(contentUI.getTableModel().getSelectedRow(), true); + + } else { + + // reset existing entry + contentUI.getTableModel().resetEditBean(); + + } + } + +} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SaveEditUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SaveEditUIAction.java index 25b4a7a..04ad480 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SaveEditUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SaveEditUIAction.java @@ -36,7 +36,7 @@ import static org.nuiton.i18n.I18n.n; * @author Tony Chemit - chemit@codelutin.com * @since 1.4 */ -public class SaveEditUIAction extends AbstractUIAction { +public class SaveEditUIAction extends AbstractContentUIAction { private static final long serialVersionUID = 1L; @@ -47,15 +47,14 @@ public class SaveEditUIAction extends AbstractUIAction { ACTION_NAME, n("observe.action.save"), n("observe.action.save.tip"), - ACTION_NAME + ACTION_NAME, + "ctrl pressed S" ); } @Override - public void actionPerformed(final ActionEvent e) { - SwingUtilities.invokeLater(() -> { - ContentUI<?, ?> contentUI = getContentUI(e); - contentUI.save(true); - }); + protected void actionPerformed(ContentUI<?, ?> contentUI) { + contentUI.save(true); } + } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SaveTableEntryUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SaveTableEntryUIAction.java new file mode 100644 index 0000000..469e349 --- /dev/null +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SaveTableEntryUIAction.java @@ -0,0 +1,39 @@ +package fr.ird.observe.application.swing.ui.actions.shared; + +import fr.ird.observe.application.swing.ui.ObserveMainUI; +import fr.ird.observe.application.swing.ui.content.ContentUI; +import fr.ird.observe.application.swing.ui.content.table.ContentTableUI; + +/** + * Created on 10/11/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.1 + */ +public class SaveTableEntryUIAction extends AbstractContentUIAction { + + public static final String ACTION_NAME = "saveTableEntry"; + + public SaveTableEntryUIAction(ObserveMainUI mainUI) { + super(mainUI, ACTION_NAME, "", "", "revert", "ctrl shift pressed S"); + } + + @Override + protected void actionPerformed(ContentUI<?, ?> content) { + ContentTableUI<?, ?, ?> contentUI = (ContentTableUI<?, ?, ?>) content; + + if (contentUI.getTableModel().isCreate()) { + + // save new entry + contentUI.getTableModel().updateRowFromEditBean(); + + } else { + + // save existing entry + contentUI.getTableModel().updateRowFromEditBean(); + + } + + } + +} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SelectNodeUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SelectNodeUIAction.java index 0a1e5a7..3fd936f 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SelectNodeUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SelectNodeUIAction.java @@ -49,7 +49,8 @@ public class SelectNodeUIAction extends AbstractUIAction { ACTION_NAME, n("observe.action.selectNode"), n("observe.action.selectNode.tip"), - "go-jump" + "go-jump", + null ); } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SelectOpenNodeUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SelectOpenNodeUIAction.java index bc36961..616273c 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SelectOpenNodeUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/shared/SelectOpenNodeUIAction.java @@ -41,12 +41,19 @@ public class SelectOpenNodeUIAction extends AbstractUIAction { private static final long serialVersionUID = 1L; public SelectOpenNodeUIAction(ObserveMainUI mainUI) { - super(mainUI, ACTION_NAME, "<NONE>", "<NONE>", "go-down"); + super(mainUI, + ACTION_NAME, + "<NONE>", + "<NONE>", + "go-down", + null); } @Override public void actionPerformed(ActionEvent e) { - + if (!canExecuteAction(e)) { + return; + } JComponent c = (JComponent) e.getSource(); Class<?> type = (Class<?>) c.getClientProperty("type"); Objects.requireNonNull(type, "could not find client property type on component" + c); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUI.jaxx b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUI.jaxx index 9b002c3..de045dc 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUI.jaxx +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUI.jaxx @@ -76,7 +76,7 @@ <String id='contentTitle' javaBean='null'/> - <BlockingLayerUI id='blockLayerUI'/> + <ContentUIBlockingLayerUI id='blockLayerUI' constructorParams="this"/> <script><![CDATA[ public Object getSelectedBean(JComboBox combo) { diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIBlockingLayerUI.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIBlockingLayerUI.java new file mode 100644 index 0000000..e60fbfe --- /dev/null +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIBlockingLayerUI.java @@ -0,0 +1,113 @@ +package fr.ird.observe.application.swing.ui.content; + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.application.swing.ui.actions.shared.AbstractUIAction; +import jaxx.runtime.swing.BlockingLayerUI; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.jxlayer.JXLayer; + +import javax.swing.Action; +import javax.swing.ActionMap; +import javax.swing.InputMap; +import javax.swing.JComponent; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.util.Objects; +import java.util.Set; + +/** + * Created on 09/11/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.1 + */ +public class ContentUIBlockingLayerUI extends BlockingLayerUI { + + /** Logger */ + private static final Log log = LogFactory.getLog(ContentUIBlockingLayerUI.class); + + private static final Set<Integer> GLOBAL_KEY_CODES = ImmutableSet.of( + KeyEvent.VK_F1, + KeyEvent.VK_F2, + KeyEvent.VK_F3, + KeyEvent.VK_F4, + KeyEvent.VK_F5, + KeyEvent.VK_F6, + KeyEvent.VK_F7, + KeyEvent.VK_F8 + ); + + private final ContentUI ui; + + public ContentUIBlockingLayerUI(ContentUI ui) { + this.ui = ui; + } + + @Override + protected void processKeyEvent(KeyEvent e, JXLayer<? extends JComponent> l) { + + InputMap inputMap = ui.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + ActionMap actionMap = ui.getActionMap(); + + boolean consumed = false; + + if (e.isControlDown() && e.getKeyChar() != '\uFFFF') { + + KeyStroke keyStroke = KeyStroke.getKeyStroke("ctrl pressed " + (char) e.getKeyCode()); + + if (keyStroke == null) { + super.processKeyEvent(e, l); + return; + } + consumed = doAction(keyStroke, inputMap, actionMap); + } + + if (!consumed && !e.isControlDown() && !e.isShiftDown() && !e.isAltDown() && !e.isAltGraphDown() + && !e.isMetaDown() && GLOBAL_KEY_CODES.contains(e.getKeyCode())) { + + KeyStroke keyStroke = KeyStroke.getKeyStroke("pressed " + (char) e.getKeyCode()); + + if (keyStroke == null) { + super.processKeyEvent(e, l); + return; + } + + consumed = doAction(keyStroke, inputMap, actionMap); + } + + if (consumed) { + e.consume(); + } else { + super.processKeyEvent(e, l); + } + + } + + protected boolean doAction(KeyStroke keyStroke, InputMap inputMap, ActionMap actionMap) { + + String actionName = (String) inputMap.get(keyStroke); + if (actionName != null) { + + Action action = actionMap.get(actionName); + + JComponent editor = (JComponent) action.getValue(AbstractUIAction.EDITOR); + Objects.requireNonNull(editor, "No editor on action: " + action); + if (editor.isVisible() && editor.isEnabled()) { + + if (log.isInfoEnabled()) { + log.info("Found action: " + action.getValue(Action.NAME) + " for keyStroke: " + keyStroke); + } + SwingUtilities.invokeLater(() -> action.actionPerformed(new ActionEvent(ui, 0, (String) action.getValue(Action.NAME)))); + return true; + } else { + if (log.isInfoEnabled()) { + log.info("Found disabled action: " + action.getValue(Action.NAME) + " for keyStroke: " + keyStroke); + } + } + } + return false; + } +} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIInitializer.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIInitializer.java index 97ac366..bf5e7c1 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIInitializer.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIInitializer.java @@ -37,7 +37,6 @@ import fr.ird.observe.application.swing.validation.ObserveSwingValidator; import fr.ird.observe.services.dto.AbstractReference; import fr.ird.observe.services.dto.DataDto; import fr.ird.observe.services.dto.DataReference; -import fr.ird.observe.services.dto.Form; import fr.ird.observe.services.dto.IdDto; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.dto.referential.ReferentialReference; @@ -72,7 +71,6 @@ import org.nuiton.util.DateUtil; import javax.swing.AbstractAction; import javax.swing.AbstractButton; import javax.swing.Action; -import javax.swing.ActionMap; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; @@ -105,6 +103,7 @@ import java.util.Date; import java.util.EnumSet; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -196,17 +195,13 @@ public class ContentUIInitializer<E extends IdDto, UI extends ContentUI<E, UI>> } - protected Form<E> getFormDto() { - return ui.getModel().getForm(); - } - public void initUI() { if (log.isDebugEnabled()) { log.debug("ui " + getClass()); } - ActionMap actionMap = ObserveSwingApplicationContext.get().getActionMap(); + ObserveActionMap actionMap = ObserveSwingApplicationContext.get().getActionMap(); // initialisation des éditeurs @@ -315,13 +310,10 @@ public class ContentUIInitializer<E extends IdDto, UI extends ContentUI<E, UI>> } protected void init(UI ui, ObserveSwingValidator<?> validator) { - SwingValidatorUtil.listenValidatorContextNameAndRefreshFields( - validator, - (JAXXValidator) ui - ); + SwingValidatorUtil.listenValidatorContextNameAndRefreshFields(validator, (JAXXValidator) ui); } - protected void init(ActionMap actionMap, AbstractButton editor) { + protected void init(ObserveActionMap actionMap, AbstractButton editor) { String actionId = (String) editor.getClientProperty(OBSERVE_ACTION); if (actionId == null) { // le boutton n'est pas commun @@ -336,20 +328,14 @@ public class ContentUIInitializer<E extends IdDto, UI extends ContentUI<E, UI>> // on a trouve une action commune AbstractUIAction action = (AbstractUIAction) actionMap.get(actionId); - - if (action == null) { - - // l'action n'est pas enregistrée - throw new IllegalStateException( - "action [" + actionId + "] not found for ui " + - ui.getClass().getName()); - } + Objects.requireNonNull(action, "action [" + actionId + "] not found for ui " + ui.getClass().getName()); if (log.isDebugEnabled()) { log.debug("init common action " + actionId); } - action.initAction(null, editor); + action.initAction(ui, editor); + } protected void init(NumberEditor editor) { diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ObserveActionMap.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ObserveActionMap.java new file mode 100644 index 0000000..c59c0e2 --- /dev/null +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ObserveActionMap.java @@ -0,0 +1,74 @@ +package fr.ird.observe.application.swing.ui.content; + +import com.google.common.collect.ImmutableMap; +import fr.ird.observe.application.swing.ObserveSwingTechnicalException; +import fr.ird.observe.application.swing.ui.ObserveMainUI; +import fr.ird.observe.application.swing.ui.actions.shared.AbstractUIAction; +import org.apache.commons.beanutils.ConstructorUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.reflections.Reflections; + +import javax.swing.Action; +import javax.swing.ActionMap; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; +import java.util.Set; + +/** + * Created on 10/11/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.1 + */ +public class ObserveActionMap extends ActionMap { + + /** Logger */ + private static final Log log = LogFactory.getLog(ObserveActionMap.class); + + private final ObserveMainUI ui; + + private final ImmutableMap<String, Class<? extends AbstractUIAction>> mapping; + + public ObserveActionMap(ObserveMainUI ui) { + this.ui = ui; + Set<Class<? extends AbstractUIAction>> actionTypes = new Reflections("fr.ird.observe.application.swing.ui.actions.shared").getSubTypesOf(AbstractUIAction.class); + + ImmutableMap.Builder<String, Class<? extends AbstractUIAction>> mappingBuilder = ImmutableMap.builder(); + for (Class<? extends AbstractUIAction> actionType : actionTypes) { + + if (Modifier.isAbstract(actionType.getModifiers())) { + continue; + } + + try { + String actionId = (String) actionType.getDeclaredField("ACTION_NAME").get(null); + mappingBuilder.put(actionId, actionType); + } catch (IllegalAccessException | NoSuchFieldException e) { + throw new ObserveSwingTechnicalException("Can't find ACTION_NAME field on action: " + actionType.getName()); + } + + } + + mapping = mappingBuilder.build(); + } + + @Override + public Action get(Object key) { + Class<? extends AbstractUIAction> actionType = mapping.get(key); + if (actionType == null) { + + return super.get(key); + } + + try { + if (log.isInfoEnabled()) { + log.info("Create action: " + key + ", type: " + actionType.getName()); + } + return ConstructorUtils.invokeConstructor(actionType, ui); + } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { + throw new ObserveSwingTechnicalException("Hum, can't creation action for type: " + actionType.getName(), e); + } + + } +} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/open/ContentOpenableUI.jcss b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/open/ContentOpenableUI.jcss index e75656d..2626b6e 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/open/ContentOpenableUI.jcss +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/open/ContentOpenableUI.jcss @@ -53,14 +53,18 @@ #reopen { _observeAction:{ReOpenUIAction.ACTION_NAME}; visible:{model.isReadingMode() && model.isCanReopen()}; + enabled:{model.isReadingMode() && model.isCanReopen()}; + } #close { _observeAction:{CloseOpenUIAction.ACTION_NAME}; visible:{model.isUpdatingMode()}; + enabled:{model.isUpdatingMode()}; } #closeAndCreate { _observeAction:{CloseAndCreateUIAction.ACTION_NAME}; visible:{model.isUpdatingMode()}; + enabled:{model.isUpdatingMode()}; } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUI.jaxx b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUI.jaxx index 1a201e0..4809b9e 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUI.jaxx +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUI.jaxx @@ -28,6 +28,10 @@ <import> fr.ird.observe.application.swing.ui.actions.shared.ResetEditUIAction fr.ird.observe.application.swing.ui.actions.shared.SaveEditUIAction + fr.ird.observe.application.swing.ui.actions.shared.NewTableEntryUIAction + fr.ird.observe.application.swing.ui.actions.shared.ResetTableEntryUIAction + fr.ird.observe.application.swing.ui.actions.shared.SaveTableEntryUIAction + fr.ird.observe.application.swing.ui.actions.shared.DeleteTableEntryUIAction jaxx.runtime.swing.BlockingLayerUI jaxx.runtime.validator.swing.SwingValidator @@ -40,6 +44,7 @@ javax.swing.UIManager static org.nuiton.i18n.I18n.n + static org.nuiton.i18n.I18n.t </import> @@ -133,33 +138,27 @@ public abstract SwingValidator<D> getValidatorTable(); <row> <cell weightx='1'> <!-- ajouter une nouvelle entrée --> - <JButton id='newEntry' - onActionPerformed='getTableModel().addNewEntry()'/> + <JButton id='newEntry'/> </cell> <cell weightx='1'> <!-- annuler la création d'une nouvelle entrée (en mode creation) --> - <JButton id='resetNewEntry' - onActionPerformed='getTableModel().doRemoveRow(getTableModel().getSelectedRow(), true)'/> + <JButton id='resetNewEntry'/> </cell> <cell weightx='1'> <!-- réinitialiser l'entrée en cours d'édition (en mode mise a jour) --> - <JButton id='resetEntry' - onActionPerformed='getHandler().resetEditBean()'/> + <JButton id='resetEntry'/> </cell> <cell weightx='1'> <!-- sauver dans le tableau l'entrée en cours d'édition (en mode mise a jour)--> - <JButton id='saveEntry' - onActionPerformed='getTableModel().updateRowFromEditBean()'/> + <JButton id='saveEntry'/> </cell> <cell weightx='1'> <!-- sauver dans le tableau la nouvelle entrée (en mode creation) --> - <JButton id='saveNewEntry' - onActionPerformed='getTableModel().updateRowFromEditBean()'/> + <JButton id='saveNewEntry'/> </cell> <cell weightx='1'> <!-- supprimer l'entrée courante dans le tableau (en mode mise a jour)--> - <JButton id='deleteEntry' - onActionPerformed='getHandler().removeSelectedRow(getTableModel().getSelectedRow())'/> + <JButton id='deleteEntry'/> </cell> </row> </Table> diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUI.jcss b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUI.jcss index 904fa75..05ca7ee 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUI.jcss +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUI.jcss @@ -73,47 +73,52 @@ } #newEntry { - text:{getNewEntryText()}; - toolTipText:{getNewEntryTip()}; - actionIcon:"add"; + _observeAction:{NewTableEntryUIAction.ACTION_NAME}; + _text:{t(getNewEntryText())}; + _toolTipText:{t(getNewEntryTip())}; visible:{tableModel.isEditable() && !tableModel.isCreate()}; } #resetNewEntry{ - text:{getResetNewEntryText()}; - toolTipText:{getResetNewEntryTip()}; + _observeAction:{ResetTableEntryUIAction.ACTION_NAME}; + _text:{t(getResetNewEntryText())}; + _toolTipText:{t(getResetNewEntryTip())}; actionIcon:"revert"; enabled:true; visible:{tableModel.isEditable() && tableModel.isCreate()}; } #resetEntry { - text:{getResetEntryText()}; - toolTipText:{getResetEntryTip()}; + _observeAction:{ResetTableEntryUIAction.ACTION_NAME}; + _text:{t(getResetEntryText())}; + _toolTipText:{t(getResetEntryTip())}; actionIcon:"revert"; enabled:{model.isCanResetRow()}; visible:{tableModel.isEditable() && !tableModel.isEmpty() && !tableModel.isCreate()}; } #saveEntry{ - text:{getSaveEntryText()}; - toolTipText:{getSaveEntryTip()}; + _observeAction:{SaveTableEntryUIAction.ACTION_NAME}; + _text:{t(getSaveEntryText())}; + _toolTipText:{t(getSaveEntryTip())}; actionIcon:"save"; visible:{tableModel.isEditable() && !tableModel.isEmpty() && !tableModel.isCreate()}; enabled:{model.isCanSaveRow()}; } #saveNewEntry { - text:{getSaveNewEntryText()}; - toolTipText:{getSaveNewEntryTip()}; + _observeAction:{SaveTableEntryUIAction.ACTION_NAME}; + _text:{t(getSaveNewEntryText())}; + _toolTipText:{t(getSaveNewEntryTip())}; actionIcon:"add"; visible:{tableModel.isEditable() && !tableModel.isEmpty() && tableModel.isCreate()}; enabled:{model.isCanSaveRow()}; } #deleteEntry { - text:{getDeleteEntryText()}; - toolTipText:{getDeleteEntryTip()}; + _observeAction:{DeleteTableEntryUIAction.ACTION_NAME}; + _text:{t(getDeleteEntryText())}; + _toolTipText:{t(getDeleteEntryTip())}; actionIcon:"delete"; visible:{tableModel.isEditable() && !tableModel.isEmpty() && !tableModel.isCreate()}; } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIHandler.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIHandler.java index 84eb829..45838e3 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIHandler.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIHandler.java @@ -219,6 +219,9 @@ public abstract class ContentTableUIHandler<E extends IdDto, D extends IdDto, U uiInitializer.initUI(); getModel().addPropertyChangeListener(ContentUIModel.PROPERTY_FORM, evt -> updateUiWithReferenceSetsFromModel()); + + ObserveSwingApplicationContext.get().getFocusManager().setFocusTraversalPolicy(ui); + } @Override diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIInitializer.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIInitializer.java index 93105a3..55c22b6 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIInitializer.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIInitializer.java @@ -22,16 +22,16 @@ package fr.ird.observe.application.swing.ui.content.table; * #L% */ -import fr.ird.observe.services.dto.IdDto; +import fr.ird.observe.application.swing.ui.content.ObserveActionMap; import fr.ird.observe.application.swing.ui.content.ContentUIInitializer; import fr.ird.observe.application.swing.ui.util.BooleanEditor; +import fr.ird.observe.services.dto.IdDto; import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.jaxx.application.bean.JavaBeanObjectUtil; import javax.swing.AbstractButton; -import javax.swing.ActionMap; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JTextArea; @@ -71,7 +71,7 @@ public class ContentTableUIInitializer<E extends IdDto, D extends IdDto, UI exte return ui.getModel(); } - protected ContentTableUIHandler<E, D, UI> getHandler() { + protected ContentTableUIHandler<E, D, UI> getHandler() { return ui.getHandler(); } @@ -167,8 +167,7 @@ public class ContentTableUIInitializer<E extends IdDto, D extends IdDto, UI exte } @Override - protected void init(ActionMap actionMap, - AbstractButton editor) { + protected void init(ObserveActionMap actionMap, AbstractButton editor) { super.init(actionMap, editor); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.