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