Author: tchemit Date: 2013-03-11 18:32:12 +0100 (Mon, 11 Mar 2013) New Revision: 580 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/580 Log: refs #2075: [TECH] Action longue (probl?\195?\168me de cin?\195?\169matique) fixes #2063: [TECH] - On devrait bloquer l'UI au lancement d'une action Modified: trunk/pom.xml trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiApplicationConfig.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiApplicationConfigOption.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionSwingWorker.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/pom.xml 2013-03-11 17:32:12 UTC (rev 580) @@ -129,7 +129,7 @@ <postgresqlVersion>9.1-901-1.jdbc4</postgresqlVersion> <licensePluginVersion>1.4</licensePluginVersion> - <jaxxVersion>2.5.12-SNAPSHOT</jaxxVersion> + <jaxxVersion>2.5.12</jaxxVersion> <swingXVersion>1.6.4</swingXVersion> <xworkVersion>2.3.7</xworkVersion> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-03-11 17:32:12 UTC (rev 580) @@ -99,6 +99,8 @@ public static final String PROPERTY_VALIDATION_CONTEXT = "validationContext"; + public static final String PROPERTY_BUSY= "busy"; + public static final Set<String> ID_TO_SAVE_PROPERTIES = Sets.newHashSet( PROPERTY_PROGRAM_ID, PROPERTY_CRUISE_ID, @@ -193,6 +195,13 @@ protected TuttiScreen screen; /** + * Busy state ({@code true} when a blocking action is running). + * @since 1.0.3 + */ + protected boolean busy; + + + /** * Message notifiers. * * @since 0.3 @@ -358,6 +367,15 @@ firePropertyChange(PROPERTY_DB_EXIST, null, dbExist); } + public boolean isBusy() { + return busy; + } + + public void setBusy(boolean busy) { + this.busy = busy; + firePropertyChange(PROPERTY_BUSY, null, busy); + } + public boolean isDbLoaded() { return dbLoaded; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiApplicationConfig.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiApplicationConfig.java 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiApplicationConfig.java 2013-03-11 17:32:12 UTC (rev 580) @@ -240,6 +240,10 @@ return applicationConfig.getOptionAsColor(TuttiApplicationConfigOption.COLOR_COMPUTED_WEIGHTS.getKey()); } + public Color getColorBlockingLayer() { + return applicationConfig.getOptionAsColor(TuttiApplicationConfigOption.COLOR_BLOCKING_LAYER.getKey()); + } + public KeyStroke getShortcutClosePopup() { return applicationConfig.getOptionAsKeyStroke(TuttiApplicationConfigOption.SHORTCUT_CLOSE_POPUP.getKey()); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiApplicationConfigOption.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiApplicationConfigOption.java 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiApplicationConfigOption.java 2013-03-11 17:32:12 UTC (rev 580) @@ -156,6 +156,13 @@ Color.class ), + COLOR_BLOCKING_LAYER( + "tutti.ui.color.blockingLayer", + n_("tutti.option.ui.color.blockingLayer.description"), + new Color(200, 200, 200).toString(), + Color.class + ), + COLOR_COMPUTED_WEIGHTS( "tutti.ui.color.computedWeights", n_("tutti.option.ui.color.computedWeights.description"), Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/config/TuttiConfigUI.java 2013-03-11 17:32:12 UTC (rev 580) @@ -117,6 +117,7 @@ .addOption(TuttiApplicationConfigOption.COLOR_CELL_WITH_VALUE) .addOption(TuttiApplicationConfigOption.COLOR_ROW_TO_CONFIRM) .addOption(TuttiApplicationConfigOption.COLOR_COMPUTED_WEIGHTS) + .addOption(TuttiApplicationConfigOption.COLOR_BLOCKING_LAYER) .addOption(TuttiApplicationConfigOption.DATE_FORMAT) .addOption(TuttiApplicationConfigOption.COORDINATE_EDITOR_TYPE); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.css 2013-03-11 17:32:12 UTC (rev 580) @@ -22,10 +22,13 @@ * #L% */ -#actionBlockerLayer { - canClick: false; - blockingColor: {model.getConfig().getColorBlockingLayer()}; +#busyBlockLayerUI { + useIcon:false; + blockingColor: {model.getConfig().getColorBlockingLayer()}; + block:{model.isBusy()}; + /*acceptedComponentNames:{UIHelper.ACCEPTABLE_COMPONENTS};*/ } + #mainFrame { title: "tutti.application.name"; defaultCloseOperation: {JFrame.DO_NOTHING_ON_CLOSE}; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx 2013-03-11 17:32:12 UTC (rev 580) @@ -31,13 +31,12 @@ fr.ifremer.tutti.ui.swing.TuttiScreen fr.ifremer.tutti.ui.swing.TuttiHelpBroker - jaxx.runtime.validator.swing.SwingValidator + jaxx.runtime.swing.BlockingLayerUI jaxx.runtime.validator.swing.SwingValidatorMessageWidget org.jdesktop.swingx.JXTitledPanel javax.swing.JFrame - javax.swing.border.EmptyBorder java.awt.BorderLayout </import> @@ -47,6 +46,8 @@ initializer='getContextValue(MainUIHandler.class)'/> <TuttiHelpBroker id='broker' constructorParams='"tuttihelp.main.help"'/> + + <BlockingLayerUI id='busyBlockLayerUI'/> <script><![CDATA[ public MainUI(TuttiUIContext context) { @@ -101,7 +102,7 @@ <!-- pour afficher l'aide contextuelle --> <JButton id='showHelp'/> - <JXTitledPanel id='body' constraints='BorderLayout.CENTER'/> + <JXTitledPanel id='body' constraints='BorderLayout.CENTER' decorator='boxed'/> <!-- status message bar --> <StatusMessagePanel id='status' constraints="BorderLayout.SOUTH"/> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java 2013-03-11 17:32:12 UTC (rev 580) @@ -50,6 +50,7 @@ import fr.ifremer.tutti.ui.swing.util.TuttiUI; import fr.ifremer.tutti.ui.swing.util.action.TuttiActionUI; import fr.ifremer.tutti.ui.swing.util.action.TuttiUIAction; +import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.AboutPanel; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.logging.Log; @@ -62,6 +63,7 @@ import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JToolBar; +import java.awt.Cursor; import java.awt.Desktop; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -116,13 +118,42 @@ } }); ui.setContextValue(ui, MainUI.class.getName()); + + // ecoute des changements de l'état busy + context.addPropertyChangeListener(TuttiUIContext.PROPERTY_BUSY, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + Boolean newvalue = (Boolean) evt.getNewValue(); + updateBusyState(newvalue != null && newvalue); + } + }); } + protected void updateBusyState(boolean busy) { + if (busy) { + // ui bloquee + if (log.isDebugEnabled()) { + log.debug("block ui in busy mode"); + } + ui.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + } else { + // ui debloquee + if (log.isDebugEnabled()) { + log.debug("unblock ui in none busy mode"); + } + ui.setCursor(Cursor.getDefaultCursor()); + } + } + @Override public void afterInitUI() { initUI(ui); + // installation layer de blocage en mode busy + SwingUtil.setLayerUI(ui.getBody(), ui.getBusyBlockLayerUI()); + // Init SwingSession SwingSession swingSession = context.getSwingSession(); swingSession.add(ui); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionSwingWorker.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionSwingWorker.java 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/action/TuttiActionSwingWorker.java 2013-03-11 17:32:12 UTC (rev 580) @@ -27,10 +27,8 @@ import fr.ifremer.tutti.ui.swing.content.MainUI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.JXTitledPanel; import javax.swing.SwingWorker; -import java.awt.Cursor; import java.util.Timer; import java.util.TimerTask; @@ -155,23 +153,12 @@ boolean hideBody = action.isHideBody(); - final MainUI mainUI = action.getContext().getMainUI(); - JXTitledPanel body = mainUI.getBody(); - if (busy) { - // ui bloquee - if (log.isDebugEnabled()) { - log.debug("block ui in busy mode"); - } - mainUI.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - } else { - // ui debloquee - if (log.isDebugEnabled()) { - log.debug("unblock ui in none busy mode"); - } - mainUI.setCursor(Cursor.getDefaultCursor()); - } + MainUI mainUI = action.getContext().getMainUI(); + + action.getContext().setBusy(busy); + if (hideBody) { - body.setVisible(!busy); + mainUI.getBody().setVisible(!busy); } } Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-03-11 11:40:32 UTC (rev 579) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-03-11 17:32:12 UTC (rev 580) @@ -338,6 +338,7 @@ tutti.option.programId.description=Identifiant de la dernière série de campagne utilisée tutti.option.protocolId.description=Identifiant du dernier protocole utilisé tutti.option.ui.autoPopupNumberEditor.description=Toujours afficher le pavé numérique lors de l'édition d'un nombre +tutti.option.ui.color.blockingLayer.description=Couleur utilisée pour bloquer l'interface lors d'une action longue tutti.option.ui.color.cellWithValue.description=Couleur d'une cellule avec des données tutti.option.ui.color.computedWeights.description=Couleur des données calculées tutti.option.ui.color.rowInvalid.description=Ligne invalide