UI: one simple way to control toolwindow toolbars visibility

This commit is contained in:
Gregory.Shrago
2014-10-28 00:59:26 +03:00
parent 9f9a64efa6
commit d8915f5e02
7 changed files with 109 additions and 31 deletions
@@ -18,12 +18,15 @@ package com.intellij.ide.hierarchy;
import com.intellij.icons.AllIcons;
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;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.wm.ex.ToolWindowEx;
import com.intellij.ui.content.ContentManager;
@State(
@@ -46,11 +49,15 @@ public final class HierarchyBrowserManager implements PersistentStateComponent<H
private final ContentManager myContentManager;
public HierarchyBrowserManager(final Project project) {
final ToolWindowManager toolWindowManager=ToolWindowManager.getInstance(project);
final ToolWindow toolWindow = toolWindowManager.registerToolWindow(ToolWindowId.HIERARCHY, true, ToolWindowAnchor.RIGHT, project);
ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project);
ToolWindow toolWindow = toolWindowManager.registerToolWindow(ToolWindowId.HIERARCHY, true, ToolWindowAnchor.RIGHT, project);
DefaultActionGroup gearActions = new DefaultActionGroup();
gearActions.addAction(SimpleToolWindowPanel.createToggleToolbarAction(toolWindow)).setAsSecondary(true);
((ToolWindowEx)toolWindow).setAdditionalGearActions(gearActions);
myContentManager = toolWindow.getContentManager();
toolWindow.setIcon(AllIcons.Toolwindows.ToolWindowHierarchy);
new ContentManagerWatcher(toolWindow,myContentManager);
new ContentManagerWatcher(toolWindow, myContentManager);
}
public final ContentManager getContentManager() {
@@ -36,6 +36,7 @@ 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;
@@ -69,6 +70,7 @@ import java.util.List;
public class StructureViewWrapperImpl implements StructureViewWrapper, Disposable {
private final Project myProject;
private final ToolWindowEx myToolWindow;
private final AnAction myShowToolbarAction;
private VirtualFile myFile;
@@ -90,6 +92,7 @@ public class StructureViewWrapperImpl implements StructureViewWrapper, Disposabl
public StructureViewWrapperImpl(Project project, ToolWindowEx toolWindow) {
myProject = project;
myToolWindow = toolWindow;
myShowToolbarAction = SimpleToolWindowPanel.createToggleToolbarAction(myToolWindow);
myUpdateQueue = new MergingUpdateQueue("StructureView", Registry.intValue("structureView.coalesceTime"), false, myToolWindow.getComponent(), this, myToolWindow.getComponent(), true);
myUpdateQueue.setRestartTimerOnAdd(true);
@@ -365,12 +368,13 @@ public class StructureViewWrapperImpl implements StructureViewWrapper, Disposabl
}
private void updateHeaderActions(StructureView structureView) {
ActionGroup gearActions = null;
DefaultActionGroup gearActions = new DefaultActionGroup();
AnAction[] titleActions = AnAction.EMPTY_ARRAY;
if (structureView instanceof StructureViewComponent) {
gearActions = ((StructureViewComponent)structureView).getGearActions();
gearActions.addAll(((StructureViewComponent)structureView).getGearActions());
titleActions = ((StructureViewComponent)structureView).getTitleActions();
}
gearActions.addAction(myShowToolbarAction).setAsSecondary(true);
myToolWindow.setAdditionalGearActions(gearActions);
myToolWindow.setTitleActions(titleActions);
}
@@ -54,7 +54,6 @@ public final class StructureViewFactoryImpl extends StructureViewFactoryEx imple
@SuppressWarnings({"WeakerAccess"}) public boolean AUTOSCROLL_MODE = true;
@SuppressWarnings({"WeakerAccess"}) public boolean AUTOSCROLL_FROM_SOURCE = false;
@SuppressWarnings({"WeakerAccess"}) public String ACTIVE_ACTIONS = "";
public boolean SHOW_TOOLBAR = false;
}
private final Project myProject;
@@ -154,9 +154,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
myAutoScrollToSourceHandler = new MyAutoScrollToSourceHandler();
myAutoScrollFromSourceHandler = new MyAutoScrollFromSourceHandler(myProject, this);
if (getSettings().SHOW_TOOLBAR) {
setToolbar(createToolbar());
}
setToolbar(createToolbar());
installTree();
@@ -390,25 +388,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
}
public ActionGroup getGearActions() {
DefaultActionGroup group = createActionGroup(true);
group.addAction(new ToggleAction("Show Toolbar") {
@Override
public boolean isDumbAware() {
return true;
}
@Override
public boolean isSelected(AnActionEvent e) {
return getSettings().SHOW_TOOLBAR;
}
@Override
public void setSelected(AnActionEvent e, boolean state) {
setToolbar(state ? createToolbar() : null);
getSettings().SHOW_TOOLBAR = state;
}
}).setAsSecondary(true);
return group;
return createActionGroup(true);
}
private StructureViewFactoryImpl.State getSettings() {
@@ -18,12 +18,15 @@ package com.intellij.usageView.impl;
import com.intellij.icons.AllIcons;
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;
import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.wm.ex.ToolWindowEx;
import com.intellij.ui.content.*;
import com.intellij.usageView.UsageViewManager;
import com.intellij.usages.UsageView;
@@ -41,6 +44,10 @@ public class UsageViewManagerImpl extends UsageViewManager {
ToolWindow toolWindow = toolWindowManager.registerToolWindow(ToolWindowId.FIND, true, ToolWindowAnchor.BOTTOM, project, true);
toolWindow.setToHideOnEmptyContent(true);
toolWindow.setIcon(AllIcons.Toolwindows.ToolWindowFind);
DefaultActionGroup gearActions = new DefaultActionGroup();
gearActions.addAction(SimpleToolWindowPanel.createToggleToolbarAction(toolWindow)).setAsSecondary(true);
((ToolWindowEx)toolWindow).setAdditionalGearActions(gearActions);
myFindContentManager = toolWindow.getContentManager();
myFindContentManager.addContentManagerListener(new ContentManagerAdapter() {
@Override
@@ -15,20 +15,27 @@
*/
package com.intellij.openapi.ui;
import com.intellij.openapi.actionSystem.ActionToolbar;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManagerAdapter;
import com.intellij.ui.content.ContentManagerEvent;
import com.intellij.ui.switcher.QuickActionProvider;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.AwtVisitor;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.util.LinkedList;
import java.util.List;
public class SimpleToolWindowPanel extends JPanel implements QuickActionProvider, DataProvider {
@@ -74,6 +81,10 @@ public class SimpleToolWindowPanel extends JPanel implements QuickActionProvider
});
}
public boolean isToolbarVisible() {
return myToolbar != null && myToolbar.isVisible();
}
public void setToolbar(@Nullable JComponent c) {
if (c == null) {
remove(myToolbar);
@@ -159,4 +170,67 @@ public class SimpleToolWindowPanel extends JPanel implements QuickActionProvider
}
}
}
@NotNull
public static AnAction createToggleToolbarAction(@NotNull ToolWindow toolWindow) {
return new ToggleToolbarAction(toolWindow, PropertiesComponent.getInstance());
}
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) {
setContentToolbarVisible(event.getContent(), getVisibilityValue());
}
});
}
@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, state);
}
}
@NotNull
private String getProperty() {
return myToolWindow.getStripeTitle() + ".ShowToolbar";
}
private boolean getVisibilityValue() {
return myPropertiesComponent.getBoolean(getProperty(), true);
}
private static void setContentToolbarVisible(Content content, boolean state) {
LinkedList<JComponent> deque = ContainerUtil.newLinkedList(content.getComponent());
while(!deque.isEmpty()) {
JComponent component = deque.pollFirst();
if (!(component instanceof JPanel)) continue;
for (int i = 0, count = component.getComponentCount(); i < count; i++) {
Component c = component.getComponent(i);
if (c instanceof ActionToolbar) {
c.setVisible(state);
}
else if (c instanceof JPanel) {
deque.addLast((JPanel)c);
}
}
}
}
}
}
@@ -19,6 +19,7 @@ package com.intellij.openapi.vcs.changes.ui;
import com.intellij.icons.AllIcons;
import com.intellij.lifecycle.PeriodicalTasksCloser;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.components.AbstractProjectComponent;
@@ -26,6 +27,7 @@ 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;
@@ -36,6 +38,7 @@ import com.intellij.openapi.vcs.VcsListener;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.wm.ex.ToolWindowEx;
import com.intellij.ui.content.*;
import com.intellij.util.Alarm;
import com.intellij.util.NotNullFunction;
@@ -83,6 +86,10 @@ public class ChangesViewContentManager extends AbstractProjectComponent implemen
if (toolWindowManager != null) {
myToolWindow = toolWindowManager.registerToolWindow(TOOLWINDOW_ID, true, ToolWindowAnchor.BOTTOM, myProject, true);
myToolWindow.setIcon(AllIcons.Toolwindows.ToolWindowChanges);
DefaultActionGroup gearActions = new DefaultActionGroup();
gearActions.addAction(SimpleToolWindowPanel.createToggleToolbarAction(myToolWindow)).setAsSecondary(true);
((ToolWindowEx)myToolWindow).setAdditionalGearActions(gearActions);
updateToolWindowAvailability();
final ContentManager contentManager = myToolWindow.getContentManager();
myContentManagerListener = new MyContentManagerListener();