From d473435ef3eb041ae477f356660024f094ed8e9d Mon Sep 17 00:00:00 2001 From: "Vassiliy.Kudryashov" Date: Thu, 24 Nov 2016 17:05:46 +0300 Subject: [PATCH] IDEA-162580 Tool Windows show/hide state is not memorized --- .../wm/impl/HiddenSidebarButtonTest.java | 65 +++++++++++++++++++ .../com/intellij/openapi/wm/ToolWindowEP.java | 5 ++ .../openapi/wm/impl/DesktopLayout.java | 4 ++ .../wm/impl/ToolWindowManagerImpl.java | 7 +- 4 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testSrc/com/intellij/openapi/wm/impl/HiddenSidebarButtonTest.java diff --git a/java/java-tests/testSrc/com/intellij/openapi/wm/impl/HiddenSidebarButtonTest.java b/java/java-tests/testSrc/com/intellij/openapi/wm/impl/HiddenSidebarButtonTest.java new file mode 100644 index 000000000000..5a01dfbfd7e1 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/openapi/wm/impl/HiddenSidebarButtonTest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.wm.impl; + +import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.util.JDOMUtil; +import com.intellij.openapi.wm.ToolWindowEP; +import com.intellij.openapi.wm.ToolWindowId; +import com.intellij.usageView.impl.UsageViewManagerImpl; + +import java.util.Arrays; + +/** + * @author Vassiliy Kudryashov + */ + + +public class HiddenSidebarButtonTest extends ToolWindowManagerTestCase { + private static final String LAYOUT = "" + + "" + + "" + + "" + + ""; + + private static final String[] IDS = {ToolWindowId.TODO_VIEW, ToolWindowId.FIND, ToolWindowId.PROJECT_VIEW}; + private static final boolean[] ESTIMATED_TO_SHOW = {false, true, true}; + private static final boolean[] ESTIMATED_VISIBILITY = {false, false, true}; + + public void testHiddenButton() throws Exception { + DesktopLayout layout = myManager.getLayout(); + layout.readExternal(JDOMUtil.loadDocument(LAYOUT).getRootElement()); + for (String ID : IDS) { + assertFalse(layout.isToolWindowRegistered(ID)); + assertTrue(layout.isToolWindowUnregistered(ID)); + } + + ToolWindowEP[] extensions = Extensions.getExtensions(ToolWindowEP.EP_NAME); + for (ToolWindowEP extension : extensions) { + if (Arrays.asList(ToolWindowId.TODO_VIEW, ToolWindowId.FIND, ToolWindowId.PROJECT_VIEW).contains(extension.id)) { + myManager.initToolWindow(extension); + } + } + new UsageViewManagerImpl(myManager.getProject(), myManager); + + for (int i = 0; i < IDS.length; i++) { + assertTrue(layout.isToolWindowRegistered(IDS[i])); + assertFalse(layout.isToolWindowUnregistered(IDS[i])); + assertTrue(ESTIMATED_TO_SHOW[i] == layout.getInfo(IDS[i], true).isShowStripeButton()); + assertTrue(ESTIMATED_VISIBILITY[i] == myManager.getStripeButton(IDS[i]).isVisible()); + } + } +} diff --git a/platform/platform-api/src/com/intellij/openapi/wm/ToolWindowEP.java b/platform/platform-api/src/com/intellij/openapi/wm/ToolWindowEP.java index cd8cbfd50f9c..c8dea6e55600 100644 --- a/platform/platform-api/src/com/intellij/openapi/wm/ToolWindowEP.java +++ b/platform/platform-api/src/com/intellij/openapi/wm/ToolWindowEP.java @@ -104,4 +104,9 @@ public class ToolWindowEP extends AbstractExtensionPointBean { } return null; } + + @Override + public String toString() { + return getClass().getSimpleName() + ":" + id; + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/DesktopLayout.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/DesktopLayout.java index a3cc0dea6e31..c0a193d3335d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/DesktopLayout.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/DesktopLayout.java @@ -222,6 +222,10 @@ public final class DesktopLayout implements JDOMExternalizable { return myRegisteredId2Info.containsKey(id); } + final boolean isToolWindowUnregistered(final String id) { + return myUnregisteredId2Info.containsKey(id); + } + /** * @return comparator which compares StripeButtons in the stripe with * specified anchor. diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java index e330bfaf2555..1928acf17253 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java @@ -864,7 +864,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements /** * @return tool button for the window with specified ID. */ - private StripeButton getStripeButton(@NotNull String id) { + StripeButton getStripeButton(@NotNull String id) { return myId2StripeButton.get(id); } @@ -1162,6 +1162,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements LOG.debug("enter: installToolWindow(" + id + "," + component + "," + anchor + "\")"); } ApplicationManager.getApplication().assertIsDispatchThread(); + boolean known = myLayout.isToolWindowUnregistered(id); if (myLayout.isToolWindowRegistered(id)) { throw new IllegalArgumentException("window with id=\"" + id + "\" is already registered"); } @@ -1171,7 +1172,9 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements final boolean wasVisible = info.isVisible(); info.setActive(false); info.setVisible(false); - info.setShowStripeButton(shouldBeAvailable); + if (!known) { + info.setShowStripeButton(shouldBeAvailable); + } // Create decorator