UI: one simple way to control toolwindow toolbars visibility 5

This commit is contained in:
Gregory.Shrago
2014-11-07 09:54:42 +03:00
parent 234488760b
commit 0989d07237
8 changed files with 165 additions and 102 deletions
@@ -17,11 +17,11 @@
package com.intellij.ide.hierarchy;
import com.intellij.icons.AllIcons;
import com.intellij.ide.actions.ToggleToolbarAction;
import com.intellij.ide.impl.ContentManagerWatcher;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.components.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowId;
@@ -52,7 +52,7 @@ public final class HierarchyBrowserManager implements PersistentStateComponent<H
ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project);
ToolWindow toolWindow = toolWindowManager.registerToolWindow(ToolWindowId.HIERARCHY, true, ToolWindowAnchor.RIGHT, project);
DefaultActionGroup gearActions = new DefaultActionGroup();
gearActions.addAction(SimpleToolWindowPanel.createToggleToolbarAction(project, toolWindow)).setAsSecondary(true);
gearActions.addAction(ToggleToolbarAction.createToggleToolbarGroup(project, toolWindow)).setAsSecondary(true);
((ToolWindowEx)toolWindow).setAdditionalGearActions(gearActions);
myContentManager = toolWindow.getContentManager();
@@ -16,8 +16,10 @@
package com.intellij.ide.impl;
import com.intellij.ide.CommonActionsManager;
import com.intellij.ide.DataManager;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.actions.ToggleToolbarAction;
import com.intellij.ide.projectView.impl.ProjectRootsUtil;
import com.intellij.ide.structureView.*;
import com.intellij.ide.structureView.impl.StructureViewComposite;
@@ -36,7 +38,6 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
@@ -92,7 +93,7 @@ public class StructureViewWrapperImpl implements StructureViewWrapper, Disposabl
public StructureViewWrapperImpl(Project project, ToolWindowEx toolWindow) {
myProject = project;
myToolWindow = toolWindow;
myShowToolbarAction = SimpleToolWindowPanel.createToggleToolbarAction(project, myToolWindow);
myShowToolbarAction = ToggleToolbarAction.createToggleToolbarGroup(project, myToolWindow);
myUpdateQueue = new MergingUpdateQueue("StructureView", Registry.intValue("structureView.coalesceTime"), false, myToolWindow.getComponent(), this, myToolWindow.getComponent(), true);
myUpdateQueue.setRestartTimerOnAdd(true);
@@ -368,12 +369,14 @@ public class StructureViewWrapperImpl implements StructureViewWrapper, Disposabl
}
private void updateHeaderActions(StructureView structureView) {
DefaultActionGroup gearActions = new DefaultActionGroup();
AnAction[] titleActions = AnAction.EMPTY_ARRAY;
if (structureView instanceof StructureViewComponent) {
gearActions.addAll(((StructureViewComponent)structureView).getGearActions());
titleActions = ((StructureViewComponent)structureView).getTitleActions();
JTree tree = ((StructureViewComponent)structureView).getTree();
titleActions = new AnAction[]{
CommonActionsManager.getInstance().createExpandAllHeaderAction(tree),
CommonActionsManager.getInstance().createCollapseAllHeaderAction(tree)};
}
DefaultActionGroup gearActions = new DefaultActionGroup();
gearActions.addAction(myShowToolbarAction).setAsSecondary(true);
myToolWindow.setAdditionalGearActions(gearActions);
myToolWindow.setTitleActions(titleActions);
@@ -16,7 +16,6 @@
package com.intellij.ide.structureView.newStructureView;
import com.intellij.ide.CommonActionsManager;
import com.intellij.ide.CopyPasteDelegator;
import com.intellij.ide.DataManager;
import com.intellij.ide.PsiCopyPasteManager;
@@ -387,26 +386,11 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
}
}
public ActionGroup getGearActions() {
return createActionGroup(true);
}
private StructureViewFactoryImpl.State getSettings() {
return ((StructureViewFactoryImpl)StructureViewFactory.getInstance(myProject)).getState();
}
public AnAction[] getTitleActions() {
return new AnAction[]{
CommonActionsManager.getInstance().createExpandAllHeaderAction(getTree()),
CommonActionsManager.getInstance().createCollapseAllHeaderAction(getTree()),
};
}
protected ActionGroup createActionGroup() {
return createActionGroup(false);
}
protected DefaultActionGroup createActionGroup(boolean togglesOnly) {
DefaultActionGroup result = new DefaultActionGroup();
Sorter[] sorters = myTreeModel.getSorters();
for (final Sorter sorter : sorters) {
@@ -431,10 +415,8 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
}
}
if (!togglesOnly) {
result.add(new ExpandAllAction(getTree()));
result.add(new CollapseAllAction(getTree()));
}
result.add(new ExpandAllAction(getTree()));
result.add(new CollapseAllAction(getTree()));
if (showScrollToFromSourceActions()) {
result.addSeparator();
@@ -17,10 +17,10 @@
package com.intellij.usageView.impl;
import com.intellij.icons.AllIcons;
import com.intellij.ide.actions.ToggleToolbarAction;
import com.intellij.ide.impl.ContentManagerWatcher;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
@@ -45,7 +45,7 @@ public class UsageViewManagerImpl extends UsageViewManager {
toolWindow.setToHideOnEmptyContent(true);
toolWindow.setIcon(AllIcons.Toolwindows.ToolWindowFind);
DefaultActionGroup gearActions = new DefaultActionGroup();
gearActions.addAction(SimpleToolWindowPanel.createToggleToolbarAction(project, toolWindow)).setAsSecondary(true);
gearActions.addAction(ToggleToolbarAction.createToggleToolbarGroup(project, toolWindow)).setAsSecondary(true);
((ToolWindowEx)toolWindow).setAdditionalGearActions(gearActions);
myFindContentManager = toolWindow.getContentManager();
@@ -15,23 +15,14 @@
*/
package com.intellij.openapi.ui;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Conditions;
import com.intellij.openapi.actionSystem.ActionToolbar;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManager;
import com.intellij.ui.content.ContentManagerAdapter;
import com.intellij.ui.content.ContentManagerEvent;
import com.intellij.ui.switcher.QuickActionProvider;
import com.intellij.util.ui.AwtVisitor;
import com.intellij.util.ui.JBSwingUtilities;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -172,61 +163,4 @@ public class SimpleToolWindowPanel extends JPanel implements QuickActionProvider
}
}
}
@NotNull
public static AnAction createToggleToolbarAction(Project project, @NotNull ToolWindow toolWindow) {
return new ToggleToolbarAction(toolWindow, PropertiesComponent.getInstance(project));
}
private static class ToggleToolbarAction extends ToggleAction implements DumbAware {
private final PropertiesComponent myPropertiesComponent;
private final ToolWindow myToolWindow;
private ToggleToolbarAction(@NotNull ToolWindow toolWindow, @NotNull PropertiesComponent propertiesComponent) {
super("Show Toolbar");
myPropertiesComponent = propertiesComponent;
myToolWindow = toolWindow;
myToolWindow.getContentManager().addContentManagerListener(new ContentManagerAdapter() {
@Override
public void contentAdded(ContentManagerEvent event) {
JComponent component = event.getContent().getComponent();
setContentToolbarVisible(component, getVisibilityValue());
// support nested content managers, e.g. RunnerLayoutUi as content component
ContentManager contentManager =
component instanceof DataProvider ? PlatformDataKeys.CONTENT_MANAGER.getData((DataProvider)component) : null;
if (contentManager != null) contentManager.addContentManagerListener(this);
}
});
}
@Override
public boolean isSelected(AnActionEvent e) {
return getVisibilityValue();
}
@Override
public void setSelected(AnActionEvent e, boolean state) {
myPropertiesComponent.setValue(getProperty(), String.valueOf(state), String.valueOf(true));
for (Content content : myToolWindow.getContentManager().getContents()) {
setContentToolbarVisible(content.getComponent(), state);
}
}
@NotNull
private String getProperty() {
return myToolWindow.getStripeTitle() + ".ShowToolbar";
}
private boolean getVisibilityValue() {
return myPropertiesComponent.getBoolean(getProperty(), true);
}
private static void setContentToolbarVisible(@NotNull JComponent root, boolean state) {
for (Component c : JBSwingUtilities.uiTraverser().preOrderTraversal(root).filter(Conditions.instanceOf(ActionToolbar.class))) {
c.setVisible(state);
}
}
}
}
@@ -0,0 +1,144 @@
/*
* Copyright 2000-2014 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.ide.actions;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManager;
import com.intellij.ui.content.ContentManagerAdapter;
import com.intellij.ui.content.ContentManagerEvent;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.JBSwingUtilities;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.List;
/**
* @author gregsh
*/
public class ToggleToolbarAction extends ToggleAction implements DumbAware {
@NotNull
public static ActionGroup createToggleToolbarGroup(@NotNull Project project, @NotNull ToolWindow toolWindow) {
return new DefaultActionGroup(new ToolbarTogglesGroup(toolWindow),
new ToggleToolbarAction(toolWindow, PropertiesComponent.getInstance(project)));
}
private final PropertiesComponent myPropertiesComponent;
private final ToolWindow myToolWindow;
ToggleToolbarAction(@NotNull ToolWindow toolWindow, @NotNull PropertiesComponent propertiesComponent) {
super("Show Toolbar");
myPropertiesComponent = propertiesComponent;
myToolWindow = toolWindow;
myToolWindow.getContentManager().addContentManagerListener(new ContentManagerAdapter() {
@Override
public void contentAdded(ContentManagerEvent event) {
JComponent component = event.getContent().getComponent();
setContentToolbarVisible(component, getVisibilityValue());
// support nested content managers, e.g. RunnerLayoutUi as content component
ContentManager contentManager =
component instanceof DataProvider ? PlatformDataKeys.CONTENT_MANAGER.getData((DataProvider)component) : null;
if (contentManager != null) contentManager.addContentManagerListener(this);
}
});
}
@Override
public boolean isSelected(AnActionEvent e) {
return getVisibilityValue();
}
@Override
public void setSelected(AnActionEvent e, boolean state) {
myPropertiesComponent.setValue(getProperty(), String.valueOf(state), String.valueOf(true));
for (Content content : myToolWindow.getContentManager().getContents()) {
setContentToolbarVisible(content.getComponent(), state);
}
}
@NotNull
private String getProperty() {
return getShowToolbarProperty(myToolWindow);
}
private boolean getVisibilityValue() {
return myPropertiesComponent.getBoolean(getProperty(), true);
}
private static void setContentToolbarVisible(@NotNull JComponent root, boolean state) {
for (ActionToolbar toolbar : iterateToolbars(root)) {
toolbar.getComponent().setVisible(state);
}
}
@NotNull
public static String getShowToolbarProperty(@NotNull ToolWindow window) {
return window.getStripeTitle() + ".ShowToolbar";
}
@NotNull
private static Iterable<ActionToolbar> iterateToolbars(JComponent root) {
return JBSwingUtilities.uiTraverser().preOrderTraversal(root).filter(ActionToolbar.class);
}
private static class ToolbarTogglesGroup extends ActionGroup {
private final ToolWindow myToolWindow;
public ToolbarTogglesGroup(ToolWindow toolWindow) {
super("View Options", true);
myToolWindow = toolWindow;
}
@Override
public boolean isPopup() {
return getChildren(null).length > 3;
}
@Override
public void update(AnActionEvent e) {
e.getPresentation().setVisible(!ActionGroupUtil.isGroupEmpty(this, e));
}
@NotNull
@Override
public AnAction[] getChildren(@Nullable AnActionEvent e) {
ContentManager contentManager = myToolWindow.getContentManager();
Content selectedContent = contentManager.getSelectedContent();
JComponent contentComponent = selectedContent != null ? selectedContent.getComponent() : null;
if (contentComponent == null) return EMPTY_ARRAY;
List<AnAction> result = ContainerUtil.newSmartList();
for (final ActionToolbar toolbar : iterateToolbars(contentComponent)) {
JComponent c = toolbar.getComponent();
if (c.isVisible() || !c.isValid()) continue;
List<AnAction> actions = toolbar.getActions(false);
for (AnAction action : actions) {
if (!(action instanceof ToggleAction || action instanceof Separator)) continue;
result.add(action);
}
}
return result.toArray(new AnAction[result.size()]);
}
}
}
@@ -17,6 +17,7 @@
package com.intellij.openapi.vcs.changes.ui;
import com.intellij.icons.AllIcons;
import com.intellij.ide.actions.ToggleToolbarAction;
import com.intellij.lifecycle.PeriodicalTasksCloser;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
@@ -27,7 +28,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.DumbAwareRunnable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Key;
@@ -87,7 +87,7 @@ public class ChangesViewContentManager extends AbstractProjectComponent implemen
myToolWindow = toolWindowManager.registerToolWindow(TOOLWINDOW_ID, true, ToolWindowAnchor.BOTTOM, myProject, true);
myToolWindow.setIcon(AllIcons.Toolwindows.ToolWindowChanges);
DefaultActionGroup gearActions = new DefaultActionGroup();
gearActions.addAction(SimpleToolWindowPanel.createToggleToolbarAction(myProject, myToolWindow)).setAsSecondary(true);
gearActions.addAction(ToggleToolbarAction.createToggleToolbarGroup(myProject, myToolWindow)).setAsSecondary(true);
((ToolWindowEx)myToolWindow).setAdditionalGearActions(gearActions);
updateToolWindowAvailability();
@@ -16,6 +16,7 @@
package com.intellij.openapi.vcs.impl;
import com.intellij.icons.AllIcons;
import com.intellij.ide.actions.ToggleToolbarAction;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
@@ -34,7 +35,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectEx;
import com.intellij.openapi.roots.FileIndexFacade;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
@@ -242,7 +242,7 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme
myContentManager = toolWindow.getContentManager();
toolWindow.setIcon(AllIcons.Toolwindows.VcsSmallTab);
DefaultActionGroup gearActions = new DefaultActionGroup();
gearActions.addAction(SimpleToolWindowPanel.createToggleToolbarAction(myProject, toolWindow)).setAsSecondary(true);
gearActions.addAction(ToggleToolbarAction.createToggleToolbarGroup(myProject, toolWindow)).setAsSecondary(true);
((ToolWindowEx)toolWindow).setAdditionalGearActions(gearActions);
toolWindow.installWatcher(myContentManager);
}