From 15719609530f46adc05bf3307c6037155a445c3d Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 16 Feb 2011 20:40:56 +0300 Subject: [PATCH] usage view sync dispose --- .../intellij/usages/impl/UsageViewImpl.java | 98 ++++++++++--------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java index 44c89df82d8c..d7d72a975fa9 100644 --- a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java +++ b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java @@ -125,6 +125,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra private JPanel myCentralPanel; private final GroupNode myRoot; private final UsageViewTreeModelBuilder myModel; + private final Object lock = new Object(); public UsageViewImpl(@NotNull final Project project, @NotNull UsageViewPresentation presentation, @@ -171,53 +172,56 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra if (!myPresentation.isDetachedMode()) { UIUtil.invokeLaterIfNeeded(new Runnable() { public void run() { - if (isDisposed) return; - myTree.setModel(myModel); + // lock here to avoid concurrent execution of this init and dispose in other thread + synchronized (lock) { + if (isDisposed) return; + myTree.setModel(myModel); - myRootPanel.setLayout(new BorderLayout()); + myRootPanel.setLayout(new BorderLayout()); - final SimpleToolWindowPanel twPanel = new SimpleToolWindowPanel(false, true); - myRootPanel.add(twPanel, BorderLayout.CENTER); + final SimpleToolWindowPanel twPanel = new SimpleToolWindowPanel(false, true); + myRootPanel.add(twPanel, BorderLayout.CENTER); - JPanel toolbarPanel = new JPanel(new BorderLayout()); - toolbarPanel.add(createActionsToolbar(), BorderLayout.WEST); - toolbarPanel.add(createFiltersToolbar(), BorderLayout.CENTER); - twPanel.setToolbar(toolbarPanel); + JPanel toolbarPanel = new JPanel(new BorderLayout()); + toolbarPanel.add(createActionsToolbar(), BorderLayout.WEST); + toolbarPanel.add(createFiltersToolbar(), BorderLayout.CENTER); + twPanel.setToolbar(toolbarPanel); - myCentralPanel = new JPanel(); - myCentralPanel.setLayout(new BorderLayout()); - setupCentralPanel(); + myCentralPanel = new JPanel(); + myCentralPanel.setLayout(new BorderLayout()); + setupCentralPanel(); - initTree(); - twPanel.setContent(myCentralPanel); + initTree(); + twPanel.setContent(myCentralPanel); - myTree.setCellRenderer(new UsageViewTreeCellRenderer(UsageViewImpl.this)); - collapseAll(); + myTree.setCellRenderer(new UsageViewTreeCellRenderer(UsageViewImpl.this)); + collapseAll(); - myModelTracker.addListener(UsageViewImpl.this); + myModelTracker.addListener(UsageViewImpl.this); - if (myPresentation.isShowCancelButton()) { - addButtonToLowerPane(new Runnable() { - public void run() { - close(); - } - }, UsageViewBundle.message("usage.view.cancel.button")); - } - - myTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { - public void valueChanged(final TreeSelectionEvent e) { - SwingUtilities.invokeLater(new Runnable() { + if (myPresentation.isShowCancelButton()) { + addButtonToLowerPane(new Runnable() { public void run() { - if (isDisposed) return; - List infos = getSelectedUsageInfos(); - if (infos != null && myUsagePreviewPanel != null) { - myUsagePreviewPanel.updateLayout(infos); - } + close(); } - }); + }, UsageViewBundle.message("usage.view.cancel.button")); } - }); + + myTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { + public void valueChanged(final TreeSelectionEvent e) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if (isDisposed) return; + List infos = getSelectedUsageInfos(); + if (infos != null && myUsagePreviewPanel != null) { + myUsagePreviewPanel.updateLayout(infos); + } + } + }); + } + }); + } } }); } @@ -783,17 +787,19 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra } public void dispose() { - isDisposed = true; - ToolTipManager.sharedInstance().unregisterComponent(myTree); - myModelTracker.removeListener(this); - myUpdateAlarm.cancelAllRequests(); - if (myUsagePreviewPanel != null) { - UsageViewSettings.getInstance().PREVIEW_USAGES_SPLITTER_PROPORTIONS = ((Splitter)myUsagePreviewPanel.getParent()).getProportion(); - myUsagePreviewPanel = null; - } - for (Usage usage : getUsages()) { - if (usage instanceof UsageInfo2UsageAdapter) { - ((UsageInfo2UsageAdapter)usage).dispose(); + synchronized (lock) { + isDisposed = true; + ToolTipManager.sharedInstance().unregisterComponent(myTree); + myModelTracker.removeListener(this); + myUpdateAlarm.cancelAllRequests(); + if (myUsagePreviewPanel != null) { + UsageViewSettings.getInstance().PREVIEW_USAGES_SPLITTER_PROPORTIONS = ((Splitter)myUsagePreviewPanel.getParent()).getProportion(); + myUsagePreviewPanel = null; + } + for (Usage usage : getUsages()) { + if (usage instanceof UsageInfo2UsageAdapter) { + ((UsageInfo2UsageAdapter)usage).dispose(); + } } } }