svn commit: r17085 - trunk/src/argouml-app/src/org/argouml: ui uml/diagram/ui

Tom Morris <[email protected]>
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: tfmorris
Date: 2009-04-08 23:44:31-0700
New Revision: 17085

Modified:
   trunk/src/argouml-app/src/org/argouml/ui/ProjectBrowser.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java

Log:
RESOLVED - task 67: Fix two Swing threading deadlocks
http://argoeclipse.tigris.org/issues/show_bug.cgi?id=67

Modified: trunk/src/argouml-app/src/org/argouml/ui/ProjectBrowser.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/ui/ProjectBrowser.java?view=diff&pathrev=17085&r1=17084&r2=17085
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/ui/ProjectBrowser.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/ui/ProjectBrowser.java	2009-04-08 23:44:31-0700
@@ -99,7 +99,6 @@
 import org.argouml.uml.diagram.UMLMutableGraphSupport;
 import org.argouml.uml.diagram.ui.ActionRemoveFromDiagram;
 import org.argouml.uml.ui.ActionSaveProject;
-import org.argouml.uml.ui.TabProps;
 import org.argouml.util.ArgoFrame;
 import org.argouml.util.JavaRuntimeUtility;
 import org.argouml.util.ThreadUtils;
@@ -108,7 +107,6 @@
 import org.tigris.gef.base.Layer;
 import org.tigris.gef.graph.GraphModel;
 import org.tigris.gef.presentation.Fig;
-import org.tigris.gef.ui.IStatusBar;
 import org.tigris.gef.util.Util;
 import org.tigris.swidgets.BorderSplitPane;
 import org.tigris.swidgets.Horizontal;
@@ -718,14 +716,27 @@
                 }
                 activeDiagram.addPropertyChangeListener("name", this);
                 monitoredDiagram = activeDiagram;
-                setTitle(projectFileName + " - " + activeDiagram.getName()
-                        + " - " + getAppName() + changeIndicator);
+                setTitleInternal(projectFileName + " - "
+                        + activeDiagram.getName() + " - " + getAppName()
+                        + changeIndicator);
             } else {
-                setTitle(projectFileName + " - " + getAppName() 
+                setTitleInternal(projectFileName + " - " + getAppName() 
                         + changeIndicator);
             }
         }
         
+        private void setTitleInternal(final String title) {
+            if (SwingUtilities.isEventDispatchThread()) {
+                setTitle(title);
+            } else {
+                SwingUtilities.invokeLater(new Runnable() {
+                    public void run() {
+                        setTitle(title);
+                    }
+                });
+            }
+        }
+        
         /*
          * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
          */

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java?view=diff&pathrev=17085&r1=17084&r2=17085
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java	2009-04-08 23:44:31-0700
@@ -39,6 +39,7 @@
 import javax.swing.JComponent;
 import javax.swing.JPanel;
 import javax.swing.JToolBar;
+import javax.swing.SwingUtilities;
 import javax.swing.border.EtchedBorder;
 
 import org.apache.log4j.Logger;
@@ -49,7 +50,6 @@
 import org.argouml.ui.targetmanager.TargetEvent;
 import org.argouml.ui.targetmanager.TargetManager;
 import org.argouml.uml.diagram.ArgoDiagram;
-import org.argouml.uml.diagram.DiagramUtils;
 import org.argouml.uml.ui.ActionCopy;
 import org.argouml.uml.ui.ActionCut;
 import org.tigris.gef.base.Diagram;
@@ -337,6 +337,7 @@
      * @param toolbar is the toolbar to be set.
      */
     public void setToolBar(JToolBar toolbar) {
+        // TODO: This must happen on the AWT thread
         if (!Arrays.asList(getComponents()).contains(toolbar)) {
             if (target != null) {
                 remove(((UMLDiagram) getTarget()).getJToolBar());
@@ -353,31 +354,48 @@
      * @see org.argouml.ui.targetmanager.TargetListener#targetAdded(
      *          TargetEvent)
      */
-    public void targetAdded(TargetEvent e) {
-        setTarget(e.getNewTarget());
-        select(e.getNewTargets());
+    public void targetAdded(final TargetEvent e) {
+        setNewTargets(e);
     }
 
     /*
      * @see org.argouml.ui.targetmanager.TargetListener#targetRemoved(
      *          TargetEvent)
      */
-    public void targetRemoved(TargetEvent e) {
+    public void targetRemoved(final TargetEvent e) {
         // how to handle empty target lists?
         // probably the TabDiagram should only show an empty pane in that case
-        setTarget(e.getNewTarget());
-        select(e.getNewTargets());
+        setNewTargets(e);
     }
 
     /*
      * @see org.argouml.ui.targetmanager.TargetListener#targetSet(
      *          org.argouml.ui.targetmanager.TargetEvent)
      */
-    public void targetSet(TargetEvent e) {
-        setTarget(e.getNewTarget());
-        select(e.getNewTargets());
+    public void targetSet(final TargetEvent e) {
+        setNewTargets(e);
     }
 
+    /**
+     * We have no guarantee which thread our events will be delivered on,
+     * so make sure the work gets done on our AWT event thread.
+     * 
+     * @param e the target change event 
+     */
+    private void setNewTargets(final TargetEvent e) {
+        if (SwingUtilities.isEventDispatchThread()) {
+            setTarget(e.getNewTarget());
+            select(e.getNewTargets());            
+        } else {
+            SwingUtilities.invokeLater(new Runnable() {
+                public void run() {
+                    setTarget(e.getNewTarget());
+                    select(e.getNewTargets());                
+                }
+            });
+        }
+    }
+    
     private void select(Object[] targets) {
         LayerManager manager = graph.getEditor().getLayerManager();
         List<Fig> figList = new ArrayList<Fig>();
@@ -412,6 +430,9 @@
     private static final long serialVersionUID = -3305029387374936153L;
 
     public void propertyChange(PropertyChangeEvent arg0) {
+        // Any Swing work done here needs to be queued to the AWT thread
+        // since we don't know what thread our event will arrive on 
+        
         if ("remove".equals(arg0.getPropertyName())) {
             LOG.debug("Got remove event for diagram = " + arg0.getSource() 
                     + " old value = " + arg0.getOldValue());

------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=1609868

To unsubscribe from this discussion, e-mail: [[email protected]].
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.