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]].