r316 - trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing
Author: tchemit Date: 2013-02-04 01:37:29 +0100 (Mon, 04 Feb 2013) New Revision: 316 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/316 Log: fix action loading deadlock Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiAction.java Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiAction.java 2013-02-04 00:36:29 UTC (rev 315) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiAction.java 2013-02-04 00:37:29 UTC (rev 316) @@ -134,7 +134,6 @@ if (e instanceof Exception) { ErrorDialogUI.showError((Exception) e); } - timer.cancel(); } finally { if (log.isInfoEnabled()) { log.info("After action: " + this); @@ -166,6 +165,10 @@ protected class ActionTimerTask extends TimerTask { + private final Object lock = new Object(); + + protected boolean canceled; + private final String actionName; private final String actionDescription; @@ -180,48 +183,70 @@ @Override public void run() { - MainUI ui = getContext().getMainUI(); + if (canceled) { + if (log.isInfoEnabled()) { + log.info("Task [" + AbstractTuttiAction.this + "] was already canceled, do nothing"); + } + } else { - updateBusyState(ui, true); + MainUI ui = getContext().getMainUI(); - if (log.isDebugEnabled()) { - log.debug("Task [" + AbstractTuttiAction.this + "] is started, show waiting dialog"); - } - JPanel panel = new JPanel(new BorderLayout()); - panel.setBorder(new TitledBorder((String) null)); - JLabel label = new JLabel(); - EmptyBorder border = new EmptyBorder(5, 5, 5, 5); - label.setBorder(border); - label.setText(_("tutti.message.action.running", actionDescription)); - panel.add(label, BorderLayout.CENTER); - JProgressBar progressBar = new JProgressBar(); - progressBar.setBorder(border); - progressBar.setIndeterminate(true); - panel.add(progressBar, BorderLayout.SOUTH); - d = new JDialog(ui, true); - d.setUndecorated(true); + if (log.isDebugEnabled()) { + log.debug("Task [" + AbstractTuttiAction.this + "] is started, show waiting dialog"); + } + + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(new TitledBorder((String) null)); + JLabel label = new JLabel(); + EmptyBorder border = new EmptyBorder(5, 5, 5, 5); + label.setBorder(border); + label.setText(_("tutti.message.action.running", actionDescription)); + panel.add(label, BorderLayout.CENTER); + JProgressBar progressBar = new JProgressBar(); + progressBar.setBorder(border); + progressBar.setIndeterminate(true); + panel.add(progressBar, BorderLayout.SOUTH); + + + d = new JDialog(ui, true); + d.setUndecorated(true); // d.setSize(300, 200); - d.add(panel); - d.pack(); - SwingUtil.center(ui, d); - d.setVisible(true); + d.add(panel); + d.pack(); + SwingUtil.center(ui, d); + + if (log.isInfoEnabled()) { + log.info("Try to open dialog (was canceled ? " + canceled + ")"); + } + if (!canceled) { + + updateBusyState(ui, true); + + d.setVisible(true); + } + } } + @Override public boolean cancel() { - if (log.isDebugEnabled()) { - log.debug("Task [" + AbstractTuttiAction.this + "] canceled."); - } - updateBusyState(getContext().getMainUI(), false); + synchronized (lock) { + canceled = true; + if (log.isInfoEnabled()) { + log.info("Task [" + AbstractTuttiAction.this + "] canceled."); + } + boolean cancel = super.cancel(); - if (d != null) { - d.setVisible(false); + updateBusyState(getContext().getMainUI(), false); + + if (d != null) { + d.setVisible(false); + } + return cancel; } - boolean cancel = super.cancel(); - return cancel; } protected void updateBusyState(MainUI ui, boolean busy) {
participants (1)
-
tchemit@users.forge.codelutin.com