diff --git a/platform/icons/src/general/divider.png b/platform/icons/src/general/divider.png new file mode 100644 index 000000000000..ea797b974d88 Binary files /dev/null and b/platform/icons/src/general/divider.png differ diff --git a/platform/icons/src/general/locate.png b/platform/icons/src/general/locate.png new file mode 100644 index 000000000000..82ba59505afe Binary files /dev/null and b/platform/icons/src/general/locate.png differ diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java index d7b3b7dfea22..a8fc864f69c3 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectViewImpl.java @@ -21,6 +21,7 @@ import com.intellij.history.LocalHistory; import com.intellij.history.LocalHistoryAction; import com.intellij.ide.*; import com.intellij.ide.FileEditorProvider; +import com.intellij.ide.actions.CollapseAllToolbarAction; import com.intellij.ide.impl.ProjectViewSelectInTarget; import com.intellij.ide.projectView.HelpID; import com.intellij.ide.projectView.ProjectView; @@ -69,6 +70,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.*; import com.intellij.openapi.wm.ex.ToolWindowManagerAdapter; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; +import com.intellij.openapi.wm.impl.InternalDecorator; import com.intellij.openapi.wm.impl.ToolWindowImpl; import com.intellij.openapi.wm.impl.content.ToolWindowContentUi; import com.intellij.psi.*; @@ -471,6 +473,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo myViewContentPanel.revalidate(); myViewContentPanel.repaint(); createToolbarActions(); + updateTitleActions(); newPane.setTreeChangeListener(myTreeChangeListener); myAutoScrollToSourceHandler.install(newPane.myTree); @@ -506,6 +509,25 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo myAutoScrollToSourceHandler.onMouseClicked(newPane.myTree); } + private void updateTitleActions() { + final ToolWindow window = ToolWindowManager.getInstance(myProject).getToolWindow("Project"); + if (window == null) return; + final InternalDecorator decorator = ((ToolWindowImpl)window).getDecorator(); + ScrollFromSourceAction scrollAction = null; + CollapseAllToolbarAction collapseAction = null; + for (AnAction action : myActionGroup.getChildren(null)) { + if (action instanceof ScrollFromSourceAction) { + scrollAction = (ScrollFromSourceAction)action; + myActionGroup.remove(scrollAction); + } + if (action instanceof CollapseAllToolbarAction) { + collapseAction = (CollapseAllToolbarAction)action; + myActionGroup.remove(collapseAction); + } + } + decorator.setTitleActions(new AnAction[] {scrollAction, collapseAction}); + } + // public for tests public synchronized void setupImpl(final ToolWindow toolWindow) { setupImpl(toolWindow, true); @@ -670,7 +692,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo return true; } }, getComponent()); - myActionGroup.add(collapseAllAction); + //myActionGroup.add(collapseAllAction); getCurrentProjectViewPane().addToolbarActions(myActionGroup); } @@ -1732,7 +1754,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo private class ScrollFromSourceAction extends AnAction implements DumbAware { private ScrollFromSourceAction() { - super("Scroll from Source", "Select the file open in the active editor", IconLoader.getIcon("/general/autoscrollFromSource.png")); + super("Scroll from Source", "Select the file open in the active editor", IconLoader.getIcon("/general/locate.png")); } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java index 24bb21a9c8fa..3f09393c3616 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java @@ -334,6 +334,10 @@ public final class InternalDecorator extends JPanel implements Queryable, TypeSa }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); } + public void setTitleActions(AnAction[] actions) { + myHeader.setAdditionalTitleActions(actions); + } + private static class InnerPanelBorder implements Border { private final ToolWindow myWindow; diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java index 73b627a60a5c..141317e87c2c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java @@ -63,6 +63,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { private static final Icon ourHideDownIcon = IconLoader.getIcon("/general/hideDownPart.png"); private static final Icon ourSettingsIcon = IconLoader.getIcon("/general/gear.png"); + private static final Icon ourSeparatorIcon = IconLoader.getIcon("/general/divider.png"); private ToolWindow myToolWindow; private WindowInfoImpl myInfo; @@ -70,6 +71,8 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { private BufferedImage myImage; private BufferedImage myActiveImage; private ToolWindowType myImageType; + private JPanel myButtonPanel; + private final ToolWindowHeader.ActionButton myGearButton; public ToolWindowHeader(final ToolWindowImpl toolWindow, WindowInfoImpl info, @NotNull final Producer gearProducer) { setLayout(new BorderLayout()); @@ -106,12 +109,13 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { eastPanel.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3)); add(eastPanel, BorderLayout.EAST); - eastPanel.add(new ActionButton(new AnAction() { + myGearButton = new ActionButton(new AnAction() { @Override public void actionPerformed(AnActionEvent e) { final InputEvent inputEvent = e.getInputEvent(); final ActionPopupMenu popupMenu = - ((ActionManagerImpl)ActionManager.getInstance()).createActionPopupMenu(ToolWindowContentUi.POPUP_PLACE, gearProducer.produce(), new MenuItemPresentationFactory(true)); + ((ActionManagerImpl)ActionManager.getInstance()) + .createActionPopupMenu(ToolWindowContentUi.POPUP_PLACE, gearProducer.produce(), new MenuItemPresentationFactory(true)); int x = 0; int y = 0; @@ -122,9 +126,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { popupMenu.getComponent().show(inputEvent.getComponent(), x, y); } - }, ourSettingsIcon)); - - eastPanel.add(Box.createHorizontalStrut(3)); + }, ourSettingsIcon); myHideButton = new ActionButton(new HideAction() { @Override @@ -137,7 +139,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { sideHidden(); } }, - ourHideLeftSideIcon, null, null + ourHideLeftSideIcon, null, null ) { @Override protected Icon getActiveIcon() { @@ -150,7 +152,8 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { } }; - eastPanel.add(myHideButton); + addDefaultActions(eastPanel); + myButtonPanel = eastPanel; addMouseListener(new PopupHandler() { public void invokePopup(final Component comp, final int x, final int y) { @@ -180,6 +183,13 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { setBorder(BorderFactory.createEmptyBorder(TabsUtil.TABS_BORDER, 1, TabsUtil.TABS_BORDER, 1)); } + private void addDefaultActions(JPanel eastPanel) { + eastPanel.add(myGearButton); + eastPanel.add(Box.createHorizontalStrut(6)); + eastPanel.add(myHideButton); + eastPanel.add(Box.createHorizontalStrut(1)); + } + @Override public void dispose() { removeAll(); @@ -192,7 +202,23 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { myHideButton.updateTooltip(); } } - + + public void setAdditionalTitleActions(AnAction[] actions) { + myButtonPanel.removeAll(); + boolean actionAdded = false; + for (AnAction action : actions) { + if (action == null) continue; + myButtonPanel.add(new ActionButton(action, action.getTemplatePresentation().getIcon())); + myButtonPanel.add(Box.createHorizontalStrut(7)); + actionAdded = true; + } + if (actionAdded) { + myButtonPanel.add(new JLabel(ourSeparatorIcon)); + myButtonPanel.add(Box.createHorizontalStrut(6)); + } + addDefaultActions(myButtonPanel); + } + private static Icon getHideToolWindowIcon(ToolWindow toolWindow) { ToolWindowAnchor anchor = toolWindow.getAnchor(); if (anchor == ToolWindowAnchor.BOTTOM) {