[debugger] new UI: move run toolbar into test toolbar (IJ-CR-11703)

GitOrigin-RevId: 5038cecb69e0b876de17d0756e1a15b315510a63
This commit is contained in:
maksim.pelevin
2021-07-12 19:50:20 +00:00
committed by intellij-monorepo-bot
parent a0715140d2
commit 437527c509
3 changed files with 100 additions and 3 deletions

View File

@@ -12,6 +12,7 @@ import com.intellij.execution.ui.layout.PlaceInGrid;
import com.intellij.execution.ui.layout.impl.RunnerLayoutUiImpl;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl;
import com.intellij.openapi.actionSystem.impl.MoreActionGroup;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
@@ -23,9 +24,11 @@ import com.intellij.terminal.TerminalExecutionConsole;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.tabs.PinToolwindowTabAction;
import com.intellij.util.SmartList;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -92,6 +95,10 @@ public final class RunContentBuilder extends RunTab {
ActionGroup toolbar = createActionToolbar(contentDescriptor, consoleActionsToMerge);
if (Registry.is("debugger.new.tool.window.layout")) {
mySupplier = new RunTabSupplier(toolbar) {
{
setMoveToolbar(true);
}
@Override
public @NotNull List<AnAction> getContentActions() {
return Collections.singletonList(myUi.getOptions().getLayoutActions());
@@ -100,8 +107,19 @@ public final class RunContentBuilder extends RunTab {
if (myUi instanceof RunnerLayoutUiImpl) {
((RunnerLayoutUiImpl)myUi).setLeftToolbarVisible(false);
}
myUi.getOptions().setTopLeftToolbar(toolbar, ActionPlaces.RUNNER_TOOLBAR);
boolean isToolbarVisibleAnywhere = false;
for (Component component : UIUtil.uiTraverser(contentDescriptor.getComponent())) {
if (component instanceof ActionToolbarImpl) {
ActionGroup group = ((ActionToolbarImpl)component).getActionGroup();
if (group instanceof RunTab.ToolbarActionGroup) {
isToolbarVisibleAnywhere = true;
break;
}
}
}
if (!isToolbarVisibleAnywhere) {
myUi.getOptions().setTopLeftToolbar(toolbar, ActionPlaces.RUNNER_TOOLBAR);
}
} else {
myUi.getOptions().setLeftToolbar(toolbar, ActionPlaces.RUNNER_TOOLBAR);
}

View File

@@ -17,20 +17,26 @@ import com.intellij.icons.AllIcons;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.impl.ActionButton;
import com.intellij.openapi.actionSystem.impl.MoreActionGroup;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.impl.content.SingleContentSupplier;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.GlobalSearchScopes;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentManager;
import com.intellij.ui.tabs.JBTabs;
import com.intellij.ui.tabs.JBTabsEx;
import com.intellij.ui.tabs.TabInfo;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -155,6 +161,7 @@ public abstract class RunTab implements DataProvider, Disposable {
@Nullable
private final ActionGroup myActionGroup;
private boolean myMoveToolbar = false;
public RunTabSupplier(@Nullable ActionGroup group) {
myActionGroup = group;
@@ -220,5 +227,76 @@ public abstract class RunTab implements DataProvider, Disposable {
List<Content> gridContents = ((GridImpl)tab.getComponent()).getContents();
return gridContents.size() > 0 && gridContents.get(0).isCloseable();
}
public boolean isMoveToolbar() {
return myMoveToolbar;
}
public void setMoveToolbar(boolean moveToolbar) {
myMoveToolbar = moveToolbar;
}
}
/**
* <p>A special action group that can hold Run actions.</p>
* <p>
* If {@link RunTabSupplier#isMoveToolbar()} returns <code>true</code>
* then this group prepends {@link RunTabSupplier#getToolbarActions()}.
* </p><p>
* Also, merges last {@link MoreActionGroup} groups into one.
* </p>
*/
public static final class ToolbarActionGroup extends DefaultActionGroup {
private final MoreActionGroup myMoreActionGroup = new MoreActionGroup();
public ToolbarActionGroup(ActionGroup group) {
addAll(group);
}
@Override
public AnAction @NotNull [] getChildren(@Nullable AnActionEvent e) {
AnAction[] children = super.getChildren(e);
if (e != null) {
ToolWindow window = e.getData(PlatformDataKeys.TOOL_WINDOW);
SingleContentSupplier data = e.getData(SingleContentSupplier.KEY);
if (data instanceof RunTabSupplier && window != null) {
boolean isMoveToolbar = ((RunTabSupplier)data).isMoveToolbar();
if (!isMoveToolbar) return children;
ContentManager manager = window.getContentManager();
if (manager.getContentCount() > 1) {
ActionGroup actions = data.getToolbarActions();
if (actions != null) return merge(actions.getChildren(e), children);
}
}
}
return children;
}
private AnAction @NotNull [] merge(AnAction @NotNull [] head, AnAction @NotNull [] tail) {
var result = new ArrayList<AnAction>(head.length + tail.length);
result.addAll(Arrays.asList(head));
myMoreActionGroup.removeAll();
if (ArrayUtil.getLastElement(head) instanceof MoreActionGroup) {
result.remove(result.size() - 1);
}
result.add(Separator.create());
result.addAll(Arrays.asList(tail));
if (ArrayUtil.getLastElement(tail) instanceof MoreActionGroup) {
myMoreActionGroup.addAll((ActionGroup) ArrayUtil.getLastElement(tail));
result.remove(result.size() - 1);
}
if (ArrayUtil.getLastElement(head) instanceof MoreActionGroup) {
myMoreActionGroup.add(Separator.create());
myMoreActionGroup.addAll((ActionGroup) ArrayUtil.getLastElement(head));
}
result.add(myMoreActionGroup);
return result.toArray(EMPTY_ARRAY);
}
@Override
public boolean isDumbAware() {
return true;
}
}
}

View File

@@ -43,7 +43,7 @@ public class ToolbarPanel extends JPanel implements OccurenceNavigator, Disposab
public ToolbarPanel(final TestConsoleProperties properties,
final JComponent parent) {
super(new BorderLayout());
final DefaultActionGroup actionGroup = new DefaultActionGroup();
DefaultActionGroup actionGroup = new DefaultActionGroup();
actionGroup.addAction(new DumbAwareToggleInvertedBooleanProperty(ExecutionBundle.message("junit.run.hide.passed.action.name"), ExecutionBundle.message("junit.run.hide.passed.action.description"),
AllIcons.RunConfigurations.ShowPassed,
properties, TestConsoleProperties.HIDE_PASSED_TESTS));
@@ -141,6 +141,7 @@ public class ToolbarPanel extends JPanel implements OccurenceNavigator, Disposab
if (isNewLayout) {
actionGroup.add(moreGroup);
actionGroup = new RunTab.ToolbarActionGroup(actionGroup);
}
ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.TESTTREE_VIEW_TOOLBAR, actionGroup, true);