From 06e09bd6bcd64d1856a0a9cd07d832dbe33f42b5 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 21 Jan 2010 13:38:42 +0300 Subject: [PATCH] toolwindows refactoring - 2 --- .../com/intellij/openapi/wm/ex/ToolWindowEx.java | 3 + .../intellij/openapi/wm/impl/ToolWindowImpl.java | 4 + .../intellij/openapi/wm/impl/ToolWindowsPane.java | 158 +++++++++++++++++++-- 3 files changed, 150 insertions(+), 15 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/ex/ToolWindowEx.java b/platform/platform-impl/src/com/intellij/openapi/wm/ex/ToolWindowEx.java index 6bb5e5005a..8e3ddad4d4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/ex/ToolWindowEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/ex/ToolWindowEx.java @@ -17,6 +17,7 @@ package com.intellij.openapi.wm.ex; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowType; +import com.intellij.openapi.wm.impl.InternalDecorator; import org.jetbrains.annotations.NonNls; import java.beans.PropertyChangeListener; @@ -44,5 +45,7 @@ public interface ToolWindowEx extends ToolWindow { void stretchHeight(int value); + InternalDecorator getDecorator(); + } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java index a9b2a6bb4c..75a25bd800 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java @@ -226,6 +226,10 @@ public final class ToolWindowImpl implements ToolWindowEx { myToolWindowManager.stretchHeight(this, value); } + public InternalDecorator getDecorator() { + return myDecorator; + } + public final void setAvailable(final boolean available, final Runnable runnable) { ApplicationManager.getApplication().assertIsDispatchThread(); final Boolean oldAvailable = myAvailable ? Boolean.TRUE : Boolean.FALSE; diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowsPane.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowsPane.java index 0b734ff6cb..57cbe1f43f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowsPane.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowsPane.java @@ -24,6 +24,7 @@ import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowType; +import com.intellij.openapi.wm.ex.ToolWindowEx; import com.intellij.openapi.wm.impl.commands.FinalizableCommand; import com.intellij.reference.SoftReference; import com.intellij.util.containers.HashMap; @@ -382,35 +383,162 @@ final class ToolWindowsPane extends JPanel{ private void stretch(ToolWindow wnd, int value) { if (!wnd.isVisible()) return; + Resizer resizer = null; + Component cmp = null; + if (wnd.getType() == ToolWindowType.DOCKED) { - JComponent cmp = getComponentAt(wnd.getAnchor()); - if (cmp == null) return; + cmp = getComponentAt(wnd.getAnchor()); + + if (cmp != null) { + if (wnd.getAnchor().isHorizontal()) { + resizer = myVerticalSplitter.getFirstComponent() == cmp ? new Resizer.Splitter.FirstComponent(myVerticalSplitter) : new Resizer.Splitter.LastComponent(myVerticalSplitter); + } else { + resizer = myHorizontalSplitter.getFirstComponent() == cmp ? new Resizer.Splitter.FirstComponent(myHorizontalSplitter) : new Resizer.Splitter.LastComponent(myHorizontalSplitter); + } + } + } if (wnd.getType() == ToolWindowType.SLIDING) { + cmp = wnd.getComponent(); + while (cmp != null) { + if (cmp.getParent() == myLayeredPane) break; + cmp = cmp.getParent(); + } + + if (cmp != null) { + if (wnd.getAnchor() == ToolWindowAnchor.TOP) { + resizer = new Resizer.LayeredPane.Top(cmp); + } else if (wnd.getAnchor() == ToolWindowAnchor.BOTTOM) { + resizer = new Resizer.LayeredPane.Bottom(cmp); + } else if (wnd.getAnchor() == ToolWindowAnchor.LEFT) { + resizer = new Resizer.LayeredPane.Left(cmp); + } else if (wnd.getAnchor() == ToolWindowAnchor.RIGHT) { + resizer = new Resizer.LayeredPane.Right(cmp); + } + } + } + + if (resizer == null || cmp == null) return; + + int currentValue = wnd.getAnchor().isHorizontal() ? cmp.getHeight() : cmp.getWidth(); + + int actualSize = currentValue + value; + + int minValue = wnd.getAnchor().isHorizontal() ? ((ToolWindowEx)wnd).getDecorator().getTitlePanel().getPreferredSize().height : 16 + myHorizontalSplitter.getDividerWidth(); + int maxValue = wnd.getAnchor().isHorizontal() ? myLayeredPane.getHeight() : myLayeredPane.getWidth(); + + if (actualSize < minValue) { + actualSize = minValue; + } + + if (actualSize > maxValue) { + actualSize = maxValue; + } - ThreeComponentsSplitter splitter = wnd.getAnchor().isHorizontal() ? myVerticalSplitter : myHorizontalSplitter; - int currentValue = wnd.getAnchor().isHorizontal() ? cmp.getHeight() : cmp.getWidth(); + resizer.setSize(actualSize); + } - int actualSize = currentValue + value; - int minValue = 0; - int maxValue = wnd.getAnchor().isHorizontal() ? getHeight() : getWidth(); + static interface Resizer { + void setSize(int size); - if (actualSize < minValue) { - actualSize = minValue; + abstract static class Splitter implements Resizer { + ThreeComponentsSplitter mySplitter; + + Splitter(ThreeComponentsSplitter splitter) { + mySplitter = splitter; } - if (actualSize > maxValue) { - actualSize = maxValue; + static class FirstComponent extends Splitter { + FirstComponent(ThreeComponentsSplitter splitter) { + super(splitter); + } + + public void setSize(int size) { + mySplitter.setFirstSize(size); + } } - if (splitter.getFirstComponent() == cmp) { - splitter.setFirstSize(actualSize); - } else if (splitter.getLastComponent() == cmp) { - splitter.setLastSize(actualSize); + static class LastComponent extends Splitter { + LastComponent(ThreeComponentsSplitter splitter) { + super(splitter); + } + + public void setSize(int size) { + mySplitter.setLastSize(size); + } + } + } + + abstract static class LayeredPane implements Resizer { + Component myComponent; + + protected LayeredPane(Component component) { + myComponent = component; + } + + public final void setSize(int size) { + _setSize(size); + if (myComponent.getParent() instanceof JComponent) { + JComponent parent = (JComponent)myComponent; + parent.revalidate(); + parent.repaint(); + } + } + + abstract void _setSize(int size); + + static class Left extends LayeredPane { + + Left(Component component) { + super(component); + } + + public void _setSize(int size) { + myComponent.setSize(size, myComponent.getHeight()); + } + } + + static class Right extends LayeredPane { + Right(Component component) { + super(component); + } + + public void _setSize(int size) { + Rectangle bounds = myComponent.getBounds(); + int delta = size - bounds.width; + bounds.x -= delta; + bounds.width += delta; + myComponent.setBounds(bounds); + } + } + + static class Top extends LayeredPane { + Top(Component component) { + super(component); + } + + public void _setSize(int size) { + myComponent.setSize(myComponent.getWidth(), size); + } + } + + static class Bottom extends LayeredPane { + Bottom(Component component) { + super(component); + } + + public void _setSize(int size) { + Rectangle bounds = myComponent.getBounds(); + int delta = size - bounds.height; + bounds.y -= delta; + bounds.height += delta; + myComponent.setBounds(bounds); + } } } } + private final class AddDockedComponentCmd extends FinalizableCommand{ private final JComponent myComponent; private final WindowInfoImpl myInfo; -- 2.11.4.GIT