From 8ffb6f6bd3c33d8286ae4eb62fc14b6942f6d875 Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Fri, 11 Jan 2013 18:12:35 +0400 Subject: [PATCH] IDEABKL-6104 Full screen/Compact mode --- .../hint/ImplementationViewComponent.java | 3 ++ .../ui/layout/impl/RunnerContentUi.java | 3 ++ .../ide/hierarchy/HierarchyBrowserBaseEx.java | 7 ++- .../ide/navigationToolbar/NavBarPanel.java | 3 +- .../ui/popup/util/DetailViewImpl.java | 4 +- .../src/com/intellij/ui/ScreenUtil.java | 42 ++++++++++++++++++ .../com/intellij/ui/components/JBList.java | 8 ++-- .../ui/components/JBOptionButton.java | 4 ++ .../intellij/ui/components/JBTabbedPane.java | 3 ++ .../ui/components/labels/LinkLabel.java | 4 +- .../src/com/intellij/ui/table/JBTable.java | 25 ++++++----- .../com/intellij/ui/tabs/impl/JBTabsImpl.java | 7 +-- .../actions/ToggleMacFullScreenAction.java | 5 ++- .../actionSystem/impl/ActionToolbarImpl.java | 4 +- .../openapi/wm/impl/FloatingDecorator.java | 14 +++++- .../openapi/wm/impl/IdeFrameImpl.java | 16 +++++-- .../intellij/openapi/wm/impl/IdeMenuBar.java | 7 ++- .../com/intellij/openapi/wm/impl/Stripe.java | 9 +++- .../openapi/wm/impl/ToolWindowsPane.java | 9 +++- .../openapi/wm/impl/WindowManagerImpl.java | 43 ++++++++++++++++++- .../src/com/intellij/ui/BalloonImpl.java | 3 ++ 21 files changed, 185 insertions(+), 38 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java index 85ea6fce6232..715fd486f772 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java @@ -43,6 +43,7 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiUtilCore; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.ListCellRendererWrapper; +import com.intellij.ui.ScreenUtil; import com.intellij.ui.SideBorder; import com.intellij.ui.components.JBScrollPane; import com.intellij.usages.UsageView; @@ -445,6 +446,8 @@ public class ImplementationViewComponent extends JPanel { @Override public void removeNotify() { super.removeNotify(); + if (!ScreenUtil.isStandardAddRemoveNotify(this)) + return; EditorFactory.getInstance().releaseEditor(myEditor); disposeNonTextEditor(); } diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index 1fc9d632ff16..c4bd425a7a62 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -30,6 +30,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.IdeFrame; import com.intellij.openapi.wm.ToolWindow; +import com.intellij.ui.ScreenUtil; import com.intellij.ui.UIBundle; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.awt.RelativeRectangle; @@ -1260,6 +1261,8 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac public void removeNotify() { super.removeNotify(); + if (!ScreenUtil.isStandardAddRemoveNotify(this)) + return; if (Disposer.isDisposed(RunnerContentUi.this)) return; diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBaseEx.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBaseEx.java index 212c1418da1a..a8c3d162f504 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBaseEx.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyBrowserBaseEx.java @@ -45,6 +45,7 @@ import com.intellij.pom.Navigatable; import com.intellij.psi.*; import com.intellij.psi.search.scope.packageSet.NamedScope; import com.intellij.psi.search.scope.packageSet.NamedScopesHolder; +import com.intellij.ui.ScreenUtil; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.treeStructure.Tree; import com.intellij.util.Alarm; @@ -229,7 +230,8 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem @Override public void removeNotify() { super.removeNotify(); - myRefreshAction.unregisterCustomShortcutSet(this); + if (ScreenUtil.isStandardAddRemoveNotify(this)) + myRefreshAction.unregisterCustomShortcutSet(this); } @Override @@ -290,7 +292,8 @@ public abstract class HierarchyBrowserBaseEx extends HierarchyBrowserBase implem @Override public void removeNotify() { super.removeNotify(); - myRefreshAction.unregisterCustomShortcutSet(this); + if (ScreenUtil.isStandardAddRemoveNotify(this)) + myRefreshAction.unregisterCustomShortcutSet(this); } @Override diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java index 3244c947dbc7..0286a4fa0e03 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java @@ -739,7 +739,8 @@ public class NavBarPanel extends JPanel implements DataProvider, PopupOwner, Dis @Override public void removeNotify() { super.removeNotify(); - Disposer.dispose(this); + if (ScreenUtil.isStandardAddRemoveNotify(this)) + Disposer.dispose(this); } public void updateState(final boolean show) { diff --git a/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java b/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java index 1d4b60920cec..a5c44d9d18d7 100644 --- a/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/popup/util/DetailViewImpl.java @@ -31,6 +31,7 @@ import com.intellij.openapi.util.UserDataHolder; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.IdeBorderFactory; +import com.intellij.ui.ScreenUtil; import com.intellij.ui.SideBorder; import com.intellij.ui.components.JBScrollPane; import org.jetbrains.annotations.NotNull; @@ -110,7 +111,8 @@ public class DetailViewImpl extends JPanel implements DetailView, UserDataHolder @Override public void removeNotify() { super.removeNotify(); - clearEditor(); + if (ScreenUtil.isStandardAddRemoveNotify(this)) + clearEditor(); } @Override diff --git a/platform/platform-api/src/com/intellij/ui/ScreenUtil.java b/platform/platform-api/src/com/intellij/ui/ScreenUtil.java index 0de33ee14d96..8d87435f8e62 100644 --- a/platform/platform-api/src/com/intellij/ui/ScreenUtil.java +++ b/platform/platform-api/src/com/intellij/ui/ScreenUtil.java @@ -20,6 +20,7 @@ import com.intellij.openapi.util.SystemInfo; import com.intellij.util.containers.WeakHashMap; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.awt.*; import java.util.Map; @@ -28,6 +29,7 @@ import java.util.Map; * @author Konstantin Bulenkov */ public class ScreenUtil { + public static final String DISPOSE_TEMPORARY = "dispose.temporary"; @Nullable private static final Map> ourInsetsCache; static { final boolean useCache = SystemInfo.isXWindow && !GraphicsEnvironment.isHeadless(); @@ -80,6 +82,46 @@ public class ScreenUtil { return answer; } + public static GraphicsDevice getScreenDevice(Rectangle bounds) { + GraphicsDevice candidate = null; + int maxIntersection = 0; + + for (GraphicsDevice device : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) { + GraphicsConfiguration config = device.getDefaultConfiguration(); + final Rectangle rect = config.getBounds(); + Rectangle intersection = rect.intersection(bounds); + if (intersection.isEmpty()) { + continue; + } + if (intersection.width * intersection.height > maxIntersection) { + maxIntersection = intersection.width * intersection.height; + candidate = device; + } + } + + return candidate; + } + + /** + * Method removeNotify (and then addNotify) will be invoked for all components when main frame switches between states "Normal" <-> "FullScreen". + * In this case we shouldn't call Disposer in removeNotify and/or release some resources that we won't initialize again in addNotify (e.g. listeners). + */ + public static boolean isStandardAddRemoveNotify(Component component) { + JRootPane rootPane = findMainRootPane(component); + return rootPane == null || rootPane.getClientProperty(DISPOSE_TEMPORARY) == null; + } + + private static JRootPane findMainRootPane(Component component) { + while(component != null) { + Container parent = component.getParent(); + if (parent == null) + return component instanceof RootPaneContainer ? ((RootPaneContainer) component).getRootPane() : null; + component = parent; + } + return null; + } + + private static Rectangle applyInsets(Rectangle rect, Insets i) { if (i == null) { return rect; diff --git a/platform/platform-api/src/com/intellij/ui/components/JBList.java b/platform/platform-api/src/com/intellij/ui/components/JBList.java index 44d5a604fee6..dbaf764307ac 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBList.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBList.java @@ -19,10 +19,7 @@ import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.ui.ComponentWithExpandableItems; -import com.intellij.ui.ExpandableItemsHandler; -import com.intellij.ui.ExpandableItemsHandlerFactory; -import com.intellij.ui.ExpandedItemListCellRendererWrapper; +import com.intellij.ui.*; import com.intellij.util.ArrayUtil; import com.intellij.util.NotNullFunction; import com.intellij.util.ui.AsyncProcessIcon; @@ -79,6 +76,9 @@ public class JBList extends JList implements ComponentWithEmptyText, ComponentWi public void removeNotify() { super.removeNotify(); + if (!ScreenUtil.isStandardAddRemoveNotify(this)) + return; + if (myBusyIcon != null) { remove(myBusyIcon); Disposer.dispose(myBusyIcon); diff --git a/platform/platform-api/src/com/intellij/ui/components/JBOptionButton.java b/platform/platform-api/src/com/intellij/ui/components/JBOptionButton.java index ef87213e455c..dfea588ebfe0 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBOptionButton.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBOptionButton.java @@ -68,6 +68,8 @@ public class JBOptionButton extends JButton implements MouseMotionListener { @Override public void addNotify() { super.addNotify(); + if (!ScreenUtil.isStandardAddRemoveNotify(this)) + return; myGlassPane = IdeGlassPaneUtil.find(this); if (myGlassPane != null) { myGlassPane.addMouseMotionPreprocessor(this, myDisposable); @@ -77,6 +79,8 @@ public class JBOptionButton extends JButton implements MouseMotionListener { @Override public void removeNotify() { super.removeNotify(); + if (!ScreenUtil.isStandardAddRemoveNotify(this)) + return; Disposer.dispose(myDisposable); } diff --git a/platform/platform-api/src/com/intellij/ui/components/JBTabbedPane.java b/platform/platform-api/src/com/intellij/ui/components/JBTabbedPane.java index 9869a1edac43..eed06e68e414 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBTabbedPane.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBTabbedPane.java @@ -1,6 +1,7 @@ package com.intellij.ui.components; import com.intellij.openapi.util.SystemInfo; +import com.intellij.ui.ScreenUtil; import com.intellij.util.ui.UIUtil; import org.intellij.lang.annotations.JdkConstants; import org.jetbrains.annotations.NonNls; @@ -100,6 +101,8 @@ public class JBTabbedPane extends JTabbedPane implements HierarchyListener { @Override public void removeNotify() { super.removeNotify(); + if (!ScreenUtil.isStandardAddRemoveNotify(this)) + return; for (int i=0; i