This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 5f5d63128e63d226242ea0d96aac90044f990114 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 27 13:25:04 2016 +0100 refs #8429 Possibilité de choisir les couleurs de bordure + amélioration du code de rechargement de l'ui --- .../src/main/config/ObserveSwingApplication.ini | 12 ++ ...pplication-swing-configuration_en_GB.properties | 2 + ...pplication-swing-configuration_es_ES.properties | 2 + ...pplication-swing-configuration_fr_FR.properties | 2 + .../application/swing/ui/BorderFocusListener.java | 72 -------- .../application/swing/ui/ObserveMainUI.jaxx | 4 +- .../application/swing/ui/ObserveMainUIHandler.java | 192 ++++++++++++--------- .../application/swing/ui/ObserveUICallback.java | 11 +- .../swing/ui/actions/ShowConfigAction.java | 3 + .../ui/actions/global/AbstractGlobalUIAction.java | 18 ++ .../actions/global/ChangeFocusGlobalUIAction.java | 9 +- .../global/OpenCloseDataGlobalUIAction.java | 8 +- .../swing/ui/content/ContentUIManager.java | 13 +- .../ui/tree/navigation/NavigationTreeHeader.jcss | 5 + 14 files changed, 178 insertions(+), 175 deletions(-) diff --git a/application-swing-configuration/src/main/config/ObserveSwingApplication.ini b/application-swing-configuration/src/main/config/ObserveSwingApplication.ini index 53c2015..6087171 100644 --- a/application-swing-configuration/src/main/config/ObserveSwingApplication.ini +++ b/application-swing-configuration/src/main/config/ObserveSwingApplication.ini @@ -491,6 +491,18 @@ key = ui.coordinate.format type = org.nuiton.jaxx.widgets.gis.CoordinateFormat defaultValue = "dmd" +[option focusBorderColor] +description = observe.config.ui.focusBorderColor +key = ui.focusBorder.color +type = java.awt.Color +defaultValue = "java.awt.Color[r=64,g=64,b=64]" + +[option noFocusBorderColor] +description = observe.config.ui.noFocusBorderColor +key = ui.noFocusBorderColor.color +type = java.awt.Color +defaultValue = "java.awt.Color[r=192,g=192,b=192]" + [action help] description = observe.action.commandline.help action = "fr.ird.observe.application.swing.ObserveCLAction#help" diff --git a/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_en_GB.properties b/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_en_GB.properties index 5972f04..c75c8f5 100644 --- a/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_en_GB.properties +++ b/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_en_GB.properties @@ -74,9 +74,11 @@ observe.config.speciesList.seine.targetCatch=Species for target catches observe.config.swingSessionFile.description=Swing session file. observe.config.ui.autoPopupNumberEditor=Flag sets to true when number editor show automaticly popup observe.config.ui.changeSynchroSrc=Flag sets to true if you can change local source in admin tasks +observe.config.ui.focusBorderColor=Color of the focus container border observe.config.ui.fullscreen=Flag sets to true to lauch application in full screen mode observe.config.ui.loadLocalStorage=Flag sets to true to load local data source when application starts observe.config.ui.locale=Application's language +observe.config.ui.noFocusBorderColor=Color of the not focus container border observe.config.ui.showNumberEditorButton=Flag sets to true to show button to invoke popup on number's editors observe.config.ui.showTimeEditorSlider=Show timer slider observe.config.ui.storeRemoteStorage=Flag sets to true to store in config a remote connexion (except passwords) diff --git a/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_es_ES.properties b/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_es_ES.properties index d1f3d9c..b3ad83e 100644 --- a/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_es_ES.properties +++ b/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_es_ES.properties @@ -74,9 +74,11 @@ observe.config.speciesList.seine.targetCatch=Especies par las capturas objetivo observe.config.swingSessionFile.description=Fichier de sauvegarde des états des UI. \#TODO observe.config.ui.autoPopupNumberEditor=Para mostrar automáticamente el editor numérico durante la edición de un número observe.config.ui.changeSynchroSrc=Pour autoriser la sélection de la base source dans les opérations sur base +observe.config.ui.focusBorderColor=Couleur de la bordure de la zone qui a le focus \#TODO observe.config.ui.fullscreen=Para mostrar en modo pantalla completa la aplicación observe.config.ui.loadLocalStorage=Cambiar la base local al iniciar la aplicación observe.config.ui.locale=Idioma de la aplicación (fr_FR, en_GB o es_ES) +observe.config.ui.noFocusBorderColor=Couleur de la bordure de la zone qui n'a pas le focus \#TODO observe.config.ui.showNumberEditorButton=Para mostrar el botón que permite usar el editor numérico a la izquierda de cada campo numérico observe.config.ui.showTimeEditorSlider=Para mostrar la regla de edición de las horas observe.config.ui.storeRemoteStorage=Para activar la copia de seguridad de la configuración de la fuente de datos remota diff --git a/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_fr_FR.properties b/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_fr_FR.properties index fedfa39..5207b9a 100644 --- a/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_fr_FR.properties +++ b/application-swing-configuration/src/main/resources/i18n/application-swing-configuration_fr_FR.properties @@ -74,9 +74,11 @@ observe.config.speciesList.seine.targetCatch=Espèces pour les captures cible observe.config.swingSessionFile.description=Fichier de sauvegarde des états des UI. observe.config.ui.autoPopupNumberEditor=Pour afficher automatiquement l'éditeur numérique lors de l'édition d'un nombre observe.config.ui.changeSynchroSrc=Pour autoriser la sélection de la base source dans les opérations sur base +observe.config.ui.focusBorderColor=Couleur de la bordure de la zone qui a le focus observe.config.ui.fullscreen=Pour afficher l'application en mode pleine écran observe.config.ui.loadLocalStorage=Charger la base locale au démarrage de l'application observe.config.ui.locale=Langue utilisée par l'application (fr_FR, en_GB ou es_ES) +observe.config.ui.noFocusBorderColor=Couleur de la bordure de la zone qui n'a pas le focus observe.config.ui.showNumberEditorButton=Pour afficher le bouton qui permet d'utiliser l'éditeur numérique à gauche de chaque champs numérique observe.config.ui.showTimeEditorSlider=Pour afficher la réglette d'édition des heures observe.config.ui.storeRemoteStorage=Pour activer la sauvegarde de la configuration de la source distante diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/BorderFocusListener.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/BorderFocusListener.java deleted file mode 100644 index c225e8d..0000000 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/BorderFocusListener.java +++ /dev/null @@ -1,72 +0,0 @@ -package fr.ird.observe.application.swing.ui; - -/*- - * #%L - * ObServe :: Application Swing - * %% - * Copyright (C) 2008 - 2016 IRD, 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 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import javax.swing.JComponent; -import javax.swing.border.Border; -import javax.swing.border.LineBorder; -import java.awt.Color; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; - -/** - * Created on 10/11/16. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 5.1 - */ -public class BorderFocusListener implements FocusListener { - - private final Border defaultBorder; - private final JComponent container2; - private final Border focusBorder; - private final JComponent container; - private boolean enabled; - - public BorderFocusListener(ObserveMainUI mainUI) { - this.container = mainUI.getNavigationView(); - this.defaultBorder = container.getBorder(); - this.container2 = mainUI.getSplitpane2(); - this.focusBorder = new LineBorder(Color.blue, 3, true); - } - - @Override - public void focusGained(FocusEvent e) { - if (enabled) { - container.setBorder(focusBorder); - container2.setBorder(defaultBorder); - } - } - - @Override - public void focusLost(FocusEvent e) { - if (enabled) { - container.setBorder(defaultBorder); - container2.setBorder(focusBorder); - } - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } -} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUI.jaxx b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUI.jaxx index c1c201b..5dcc505 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUI.jaxx +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUI.jaxx @@ -97,6 +97,8 @@ <Boolean id='busy' javaBean='false'/> + <Boolean id='focusOnNavigation' javaBean='false'/> + <CardLayout2 id='contentLayout'/> <CardLayout2Ext id='bodyLayout' constructorParams='this, "body"'/> @@ -338,6 +340,4 @@ void $afterCompleteSetup() { <!-- status message bar --> <StatusMessagePanel id='status' constraints="BorderLayout.SOUTH"/> - <BorderFocusListener id="borderFocusListener" constructorParams='this'/> - </JFrame> 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 dfcbbea..3937401 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 @@ -41,7 +41,6 @@ import fr.ird.observe.application.swing.ui.util.ObserveSwingValidatorMessageTabl import fr.ird.observe.application.swing.ui.util.ObserveValidatorMessageTableRenderer; import fr.ird.observe.services.dto.AbstractObserveDto; import fr.ird.observe.services.dto.constants.ReferentialLocale; -import jaxx.runtime.JAXXContext; import jaxx.runtime.context.DefaultApplicationContext; import jaxx.runtime.context.JAXXInitialContext; import jaxx.runtime.swing.ErrorDialogUI; @@ -54,10 +53,12 @@ import org.nuiton.i18n.I18n; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.SwingUtilities; +import javax.swing.border.Border; +import javax.swing.border.LineBorder; import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreePath; import java.awt.Component; +import java.awt.Container; import java.awt.Cursor; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -171,8 +172,44 @@ public class ObserveMainUIHandler { DataContext context = ui.getDataContext(); context.populateSelectedIds(selectedIds); - BorderFocusListener borderFocusListener = ui.getBorderFocusListener(); - borderFocusListener.setEnabled(false); + JComponent focusOwner = (JComponent) ui.getFocusOwner(); + boolean focusOnNavigation = false; + + if (focusOwner != null) { + if (ui.getNavigation().equals(focusOwner)) { + focusOnNavigation = true; + } + if (ui.getNavigationTreeHeader().equals(focusOwner)) { + focusOnNavigation = true; + } + if (ui.getNavigationView().equals(focusOwner)) { + focusOnNavigation = true; + } + if (!focusOnNavigation) { + Container focusOwnerParent = focusOwner.getParent(); + while (focusOwnerParent != null) { + if (ui.getNavigation().equals(focusOwnerParent)) { + focusOnNavigation = true; + break; + } + if (ui.getNavigationTreeHeader().equals(focusOwnerParent)) { + focusOnNavigation = true; + break; + } + if (ui.getNavigationView().equals(focusOwnerParent)) { + focusOnNavigation = true; + break; + } + focusOwnerParent = focusOwnerParent.getParent(); + } + } + } + + if (focusOnNavigation) { + if (log.isInfoEnabled()) { + log.info("Focus on navigation: " + focusOwner); + } + } // on recherche l'ui (voir si elle existe déjà) ContentUI<?, ?> content = manager.getContent(uiClass); @@ -185,7 +222,7 @@ public class ObserveMainUIHandler { // on ouvre l'écran manager.openContent(content); - SwingUtilities.invokeLater(() -> borderFocusListener.setEnabled(true)); + if (focusOnNavigation) SwingUtilities.invokeLater(focusOwner::requestFocusInWindow); } /** @@ -197,26 +234,21 @@ public class ObserveMainUIHandler { */ public ObserveMainUI initUI(ObserveSwingApplicationContext context, ObserveSwingApplicationConfig config) { - SwingValidatorMessageTableModel errorModel = - new ObserveSwingValidatorMessageTableModel(); + SwingValidatorMessageTableModel errorModel = new ObserveSwingValidatorMessageTableModel(); DecoratorService decoratorService = context.getDecoratorService(); boolean reloadDecorators = false; Locale currentLocale = I18n.getDefaultLocale(); -// if (!config.getLocale().equals( -// I18n.getStore().getLanguage().getLocale())) { Locale configurationLocale = config.getLocale(); if (!configurationLocale.equals(currentLocale)) { if (log.isInfoEnabled()) { log.info("re-init I18n with locale " + configurationLocale); } I18n.setDefaultLocale(configurationLocale); -// I18n.init(configurationLocale); reloadDecorators = true; } - if (!config.getDbLocale().equals( - decoratorService.getReferentialLocale().getLocale())) { + if (!config.getDbLocale().equals(decoratorService.getReferentialLocale().getLocale())) { if (log.isInfoEnabled()) { log.info("re-init db with locale " + config.getDbLocale()); } @@ -232,16 +264,6 @@ public class ObserveMainUIHandler { decoratorService.reload(); } -// ObserveTreeHelper treeHelper = new ObserveTreeHelper(); -// ObserveSwingDataSource source = context.getDataSourcesManager().getMainDataSource(); - -// boolean open = context.getDataContext().getEnabled(); -// if (open) { -// treeHelper.initModel(source); -// } else { -// treeHelper.createEmptyModel(); -// } - JAXXInitialContext tx = new JAXXInitialContext(); tx.add(context).add(errorModel); @@ -307,7 +329,7 @@ public class ObserveMainUIHandler { config.removeJaxxPropertyChangeListener(); // scan main ui - ObserveMainUI ui = getUI(rootContext); + ObserveMainUI ui = rootContext.getMainUI(); ObserveSwingDataSource mainStorage = rootContext.getDataSourcesManager().getMainDataSource(); @@ -330,6 +352,8 @@ public class ObserveMainUIHandler { System.runFinalization(); } + focusBorder = null; + noFocusBorder = null; ui = initUI(rootContext, config); if (oldMode == null) { @@ -345,6 +369,15 @@ public class ObserveMainUIHandler { if (oldMode == ObserveUIMode.DB) { + // on met à jour le modèle de navigation + NavigationTreeModel treeModel = ui.getNavigation().getTreeModel(); + treeModel.setLoadSeine(ui.getNavigationTreeHeader().getShowSeine().isSelected()); + treeModel.setLoadLongline(ui.getNavigationTreeHeader().getShowLongline().isSelected()); + treeModel.setLoadReferential(ui.getNavigationTreeHeader().getShowReferential().isSelected()); + treeModel.setLoadEmptyProgram(ui.getNavigationTreeHeader().getShowEmptyProgram().isSelected()); + + treeModel.populate(); + // on conserve les noeuds a reselectionner rootContext.setNodesToReselect(ids); @@ -430,61 +463,16 @@ public class ObserveMainUIHandler { return l != null && l.toString().equals(expected); } - public ObserveMainUI getUI(JAXXContext context) { - if (context instanceof ObserveMainUI) { - return (ObserveMainUI) context; - } - return ObserveSwingApplicationContext.get().getMainUI(); - } - protected void $afterCompleteSetup(ObserveMainUI ui) { // bad binding, force value ui.getStopH2WebServer().setEnabled(false); -// ui.setContextValue(ui.getNavigation()); - ui.getStatus().init(); // ajout d'un ecouteur sur la navigation pour toujours mettre la scrollbar // tout à droite a chaque selection - TreeSelectionListener listener; - listener = e -> { - changeNavigationNode(ui, e); -// SwingUtilities.invokeLater(() -> { -// ui.getNavigationScrollPane().getHorizontalScrollBar().setValue(0); -// ui.getSplitpane2().resetToPreferredSizes(); -// }); - }; - ui.getNavigation().addTreeSelectionListener(listener); -// TreeWillExpandListener veteobableTreeWillExpand = new TreeWillExpandListener() { -// @Override -// public void treeWillExpand(TreeExpansionEvent event) { -// } -// -// @Override -// public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException { -// -// // le seul posant problème est la fermeture d'un noeud parent -// // du noeud courant : cela va changer la selection -// ObserveNode selectedNode = ui.getTreeHelper().getSelectedNode(); -// if (selectedNode == null) { -// // pas de noeud selectionne -// return; -// } -// -// ObserveNode o = (ObserveNode) event.getPath().getLastPathComponent(); -// if (selectedNode.equals(o) || !selectedNode.isNodeAncestor(o)) { -// return; -// } -// boolean canChange = ObserveSwingApplicationContext.get().getContentUIManager().closeSelectedContentUI(); -// if (!canChange) { -// throw new ExpandVetoException(event, "Can not collapse node " + event.getPath()); -// } -// } -// }; - -// ui.getTreeHelper().setUI(ui.getNavigation(), true, true, listener, veteobableTreeWillExpand); + ui.getNavigation().addTreeSelectionListener(e -> changeNavigationNode(ui, e)); SwingValidatorUtil.installUI(ui.getErrorTable(), new ObserveValidatorMessageTableRenderer()); @@ -493,28 +481,74 @@ public class ObserveMainUIHandler { // ecoute des changements de l'état busy ui.addPropertyChangeListener(ObserveMainUI.PROPERTY_BUSY, evt -> { - Boolean newvalue = (Boolean) evt.getNewValue(); - updateBusyState(ui, newvalue != null && newvalue); + boolean newvalue = (boolean) evt.getNewValue(); + updateBusyState(ui, newvalue); + }); + + ui.addPropertyChangeListener(ObserveMainUI.PROPERTY_FOCUS_ON_NAVIGATION, evt -> { + boolean newvalue = (boolean) evt.getNewValue(); + updateFocusOnNavigation(ui, newvalue); }); - ui.getNavigation().addFocusListener(ui.getBorderFocusListener()); + ui.getNavigationView().addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + ui.setFocusOnNavigation(true); + } + }); ui.getNavigation().addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { - ((JComponent) e.getSource()).grabFocus(); + ui.setFocusOnNavigation(true); + } + }); + ui.getNavigationTreeHeader().addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + ui.setFocusOnNavigation(true); } }); ui.getSplitpane2().addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { - if (log.isInfoEnabled()) { - log.info("grab getSplitpane2 focus: " + e); - } - ((JComponent) e.getSource()).grabFocus(); + ui.setFocusOnNavigation(false); } }); } + private Border focusBorder; + private Border noFocusBorder; + + public Border getFocusBorder() { + if (focusBorder == null) { + focusBorder = new LineBorder(ObserveSwingApplicationContext.get().getConfig().getFocusBorderColor(), 3, true); + } + return focusBorder; + } + + public Border getNoFocusBorder() { + if (noFocusBorder == null) { + noFocusBorder = new LineBorder(ObserveSwingApplicationContext.get().getConfig().getNoFocusBorderColor(), 3, true); + } + return noFocusBorder; + } + + private void updateFocusOnNavigation(ObserveMainUI ui, boolean newvalue) { + if (newvalue) { + if (log.isDebugEnabled()) { + log.debug("Focus on navigation"); + } + ui.getNavigationView().setBorder(getFocusBorder()); + ui.getSplitpane2().setBorder(getNoFocusBorder()); + } else { + if (log.isDebugEnabled()) { + log.debug("Focus on content"); + } + ui.getNavigationView().setBorder(getNoFocusBorder()); + ui.getSplitpane2().setBorder(getFocusBorder()); + } + } + protected void updateBusyState(ObserveMainUI ui, boolean busy) { if (busy) { // ui bloquee @@ -574,6 +608,8 @@ public class ObserveMainUIHandler { tree.setVisible(true); - SwingUtilities.invokeLater(tree::revalidate); + mainUI.setFocusOnNavigation(true); + + SwingUtilities.invokeLater(tree::requestFocusInWindow); } } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveUICallback.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveUICallback.java index b70467e..81578ab 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveUICallback.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveUICallback.java @@ -49,8 +49,7 @@ public enum ObserveUICallback implements Runnable { log.info("will reload application"); } ObserveSwingApplicationContext context = ObserveSwingApplicationContext.get(); - ObserveMainUIHandler handler = new ObserveMainUIHandler(); - ObserveMainUI ui = handler.getUI(context); + ObserveMainUI ui = context.getMainUI(); if (log.isDebugEnabled()) { log.debug("Ask to reload."); @@ -67,10 +66,9 @@ public enum ObserveUICallback implements Runnable { log.info("will reload ui"); } ObserveSwingApplicationContext context = ObserveSwingApplicationContext.get(); - ObserveMainUIHandler handler = new ObserveMainUIHandler(); - ObserveMainUI ui = handler.getUI(context); + ObserveMainUI ui = context.getMainUI(); ObserveSwingApplicationConfig config = ui.getConfig(); - handler.reloadUI(context, config); + ui.getHandler().reloadUI(context, config); } }, db(n("observe.action.reload.storage"), @@ -82,8 +80,7 @@ public enum ObserveUICallback implements Runnable { } ObserveSwingApplicationContext context = ObserveSwingApplicationContext.get(); - ObserveMainUIHandler handler = new ObserveMainUIHandler(); - ObserveMainUI ui = handler.getUI(context); + ObserveMainUI ui = context.getMainUI(); new ReloadStorageAction(ui).run(); // handler.launchReloadStorage(ui); } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/ShowConfigAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/ShowConfigAction.java index 964251c..1b1a036 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/ShowConfigAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/ShowConfigAction.java @@ -180,6 +180,9 @@ public class ShowConfigAction extends AbstractAction { helper.addOption(ObserveSwingApplicationConfigOption.SHOW_DATE_TIME_EDITOR_SLIDER); helper.addOption(ObserveSwingApplicationConfigOption.COORDINATE_FORMAT); + helper.addOption(ObserveSwingApplicationConfigOption.FOCUS_BORDER_COLOR); + helper.addOption(ObserveSwingApplicationConfigOption.NO_FOCUS_BORDER_COLOR); + helper.addOption(ObserveSwingApplicationConfigOption.DEFAULT_DB_MODE); helper.addOption(ObserveSwingApplicationConfigOption.DEFAULT_CREATION_MODE); helper.addOption(ObserveSwingApplicationConfigOption.STORE_REMOTE_STORAGE); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/AbstractGlobalUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/AbstractGlobalUIAction.java index ff7d344..05c1a5d 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/AbstractGlobalUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/AbstractGlobalUIAction.java @@ -25,6 +25,9 @@ package fr.ird.observe.application.swing.ui.actions.global; import fr.ird.observe.application.swing.ui.ObserveMainUI; import fr.ird.observe.application.swing.ui.actions.shared.AbstractUIAction; +import javax.swing.JComponent; +import javax.swing.SwingUtilities; + /** * Created on 11/11/16. * @@ -37,4 +40,19 @@ public abstract class AbstractGlobalUIAction extends AbstractUIAction { super(mainUI, actionId, "<NONE>", "<NONE>", "reset", acceleratorKey); } + public void actionPerformed(Runnable r) { + + boolean focusOnNavigation = getMainUI().isFocusOnNavigation(); + JComponent focusOwner = (JComponent) getMainUI().getFocusOwner(); + + r.run(); + + if (focusOnNavigation) { + +// SwingUtilities.invokeLater(focusOwner::grabFocus); + SwingUtilities.invokeLater(focusOwner::requestFocusInWindow); + + } + } + } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/ChangeFocusGlobalUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/ChangeFocusGlobalUIAction.java index 5a6fcc8..f1ad3a4 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/ChangeFocusGlobalUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/ChangeFocusGlobalUIAction.java @@ -28,7 +28,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.swing.JComponent; -import javax.swing.JTree; import javax.swing.SwingUtilities; import java.awt.FocusTraversalPolicy; import java.awt.event.ActionEvent; @@ -52,13 +51,14 @@ public class ChangeFocusGlobalUIAction extends AbstractGlobalUIAction { @Override public void actionPerformed(ActionEvent e) { - JTree navigation = getMainUI().getNavigation(); + boolean navigation = getMainUI().isFocusOnNavigation(); JComponent focusComponent; - if (navigation.isFocusOwner()) { + if (navigation) { if (log.isInfoEnabled()) { log.info("Focus to content"); } + getMainUI().setFocusOnNavigation(false); ContentUI<?, ?> contentUI = getContentUI(e); FocusTraversalPolicy focusTraversalPolicy = contentUI.getFocusTraversalPolicy(); focusComponent = (JComponent) focusTraversalPolicy.getFirstComponent(contentUI); @@ -74,7 +74,8 @@ public class ChangeFocusGlobalUIAction extends AbstractGlobalUIAction { if (log.isInfoEnabled()) { log.info("Focus to navigation"); } - focusComponent = navigation; + getMainUI().setFocusOnNavigation(true); + focusComponent = getMainUI().getNavigation(); } SwingUtilities.invokeLater(focusComponent::requestFocusInWindow); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/OpenCloseDataGlobalUIAction.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/OpenCloseDataGlobalUIAction.java index 7fda9ff..cb9e795 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/OpenCloseDataGlobalUIAction.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/actions/global/OpenCloseDataGlobalUIAction.java @@ -40,7 +40,7 @@ import java.util.Objects; * @author Tony Chemit - chemit@codelutin.com * @since 5.1 */ -public class OpenCloseDataGlobalUIAction extends AbstractGlobalUIAction { +public class OpenCloseDataGlobalUIAction extends AbstractGlobalUIAction implements Runnable { public static final String ACTION_NAME = "openCloseDataGlobal"; @@ -55,6 +55,12 @@ public class OpenCloseDataGlobalUIAction extends AbstractGlobalUIAction { @Override public void actionPerformed(ActionEvent e) { + actionPerformed(this); + } + + @Override + public void run() { + ContentUI<?, ?> contentUI = ObserveSwingApplicationContext.get().getContentUIManager().getSelectedContentUI(); if (contentUI instanceof ContentListUI) { diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIManager.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIManager.java index 7e6ac25..4aab8bf 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIManager.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIManager.java @@ -34,8 +34,6 @@ import org.apache.commons.logging.LogFactory; import javax.swing.JComponent; import javax.swing.JPanel; -import javax.swing.JTree; -import javax.swing.SwingUtilities; import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -110,7 +108,7 @@ public class ContentUIManager { if (log.isInfoEnabled()) { log.info("grab enter focus: " + e); } - ((JComponent) e.getSource()).grabFocus(); + getMainUI().setFocusOnNavigation(false); } @Override @@ -119,7 +117,7 @@ public class ContentUIManager { if (log.isInfoEnabled()) { log.info("grab moved focus: " + e); } - ((JComponent) e.getSource()).grabFocus(); + getMainUI().setFocusOnNavigation(false); } } }); @@ -139,9 +137,6 @@ public class ContentUIManager { log.debug("Will open ui [" + constraints + "] : " + content.getClass()); } - JTree navigation = getMainUI().getNavigation(); - boolean focusOnNavigation = navigation.isFocusOwner(); - // on ouvre l'ui try { content.open(); @@ -158,10 +153,6 @@ public class ContentUIManager { getLayout().show(getLayoutContent(), constraints); } - if (focusOnNavigation) { - SwingUtilities.invokeLater(navigation::grabFocus); - } - } public void close() { diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/tree/navigation/NavigationTreeHeader.jcss b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/tree/navigation/NavigationTreeHeader.jcss index 3527f68..0e2ffc3 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/tree/navigation/NavigationTreeHeader.jcss +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/tree/navigation/NavigationTreeHeader.jcss @@ -45,6 +45,11 @@ text:{getLabelText()}; } +JToggleButton { + focusable:false; + focusPainted:false; +} + JButton { focusable:false; focusPainted:false; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.