| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * 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.android.tools.idea.gradle.util.ui; |
| |
| import com.intellij.ide.CommonActionsManager; |
| import com.intellij.ide.DataManager; |
| import com.intellij.ide.DefaultTreeExpander; |
| import com.intellij.ide.TreeExpander; |
| import com.intellij.openapi.actionSystem.ActionManager; |
| import com.intellij.openapi.actionSystem.AnAction; |
| import com.intellij.openapi.actionSystem.AnActionEvent; |
| import com.intellij.openapi.actionSystem.DataContext; |
| import com.intellij.openapi.actionSystem.ex.ActionManagerEx; |
| import com.intellij.openapi.keymap.KeymapUtil; |
| import com.intellij.openapi.util.SystemInfo; |
| import com.intellij.openapi.wm.impl.content.BaseLabel; |
| import com.intellij.ui.InplaceButton; |
| import com.intellij.ui.JBColor; |
| import com.intellij.ui.components.panels.Wrapper; |
| import com.intellij.ui.tabs.TabsUtil; |
| import com.intellij.util.ui.UIUtil; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| import javax.swing.tree.TreeNode; |
| import java.awt.*; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| import java.awt.event.InputEvent; |
| import java.awt.image.BufferedImage; |
| |
| import static com.intellij.icons.AllIcons.General.CollapseAll; |
| import static com.intellij.icons.AllIcons.General.ExpandAll; |
| import static com.intellij.openapi.actionSystem.ActionPlaces.UNKNOWN; |
| import static com.intellij.ui.ScrollPaneFactory.createScrollPane; |
| |
| /** |
| * Panel that looks like an IDEA tool window. It has header with title and, optionally, action buttons. |
| */ |
| public class ToolWindowAlikePanel extends JPanel { |
| private final Header myHeader; |
| |
| @NotNull |
| public static ToolWindowAlikePanel createTreePanel(@NotNull String title, @NotNull JTree tree) { |
| ToolWindowAlikePanel panel = new ToolWindowAlikePanel(title, createScrollPane(tree)); |
| |
| Object root = tree.getModel().getRoot(); |
| if (root instanceof TreeNode && ((TreeNode)root).getChildCount() > 0) { |
| TreeExpander expander = new DefaultTreeExpander(tree); |
| CommonActionsManager actions = CommonActionsManager.getInstance(); |
| |
| AnAction expandAllAction = actions.createExpandAllAction(expander, tree); |
| expandAllAction.getTemplatePresentation().setIcon(ExpandAll); |
| |
| AnAction collapseAllAction = actions.createCollapseAllAction(expander, tree); |
| collapseAllAction.getTemplatePresentation().setIcon(CollapseAll); |
| |
| panel.setAdditionalTitleActions(expandAllAction, collapseAllAction); |
| } |
| |
| return panel; |
| } |
| |
| public ToolWindowAlikePanel(@NotNull String title, @NotNull JComponent contents) { |
| super(new BorderLayout()); |
| myHeader = new Header(title); |
| add(myHeader, BorderLayout.NORTH); |
| add(contents, BorderLayout.CENTER); |
| } |
| |
| public void setAdditionalTitleActions(@NotNull AnAction... actions) { |
| myHeader.setAdditionalActions(actions); |
| } |
| |
| /** |
| * Adapted from {@link com.intellij.openapi.wm.impl.ToolWindowHeader}. |
| */ |
| private static class Header extends JPanel { |
| private JPanel myButtonPanel; |
| |
| Header(@NotNull String title) { |
| super(new BorderLayout()); |
| |
| JLabel titleLabel = new JLabel(title); |
| titleLabel.setFont(BaseLabel.getLabelFont()); |
| titleLabel.setForeground(JBColor.foreground()); |
| titleLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); |
| add(titleLabel, BorderLayout.CENTER); |
| |
| myButtonPanel = new JPanel(); |
| myButtonPanel.setOpaque(false); |
| myButtonPanel.setLayout(new BoxLayout(myButtonPanel, BoxLayout.X_AXIS)); |
| myButtonPanel.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3)); |
| |
| add(myButtonPanel, BorderLayout.EAST); |
| setBorder(BorderFactory.createEmptyBorder(TabsUtil.TABS_BORDER, 1, TabsUtil.TABS_BORDER, 1)); |
| } |
| |
| @Override |
| protected void paintComponent(Graphics g) { |
| Graphics2D g2d = (Graphics2D)g; |
| Image image = drawToBuffer(getBounds().height); |
| Rectangle clipBounds = g2d.getClip().getBounds(); |
| for (int x = clipBounds.x; x < clipBounds.x + clipBounds.width; x += 150) { |
| //noinspection ConstantConditions |
| UIUtil.drawImage(g, image, x, 0, null); |
| } |
| } |
| |
| @NotNull |
| private static BufferedImage drawToBuffer(int height) { |
| int width = 150; |
| BufferedImage image = UIUtil.createImage(width, height, BufferedImage.TYPE_INT_ARGB); |
| Graphics2D g = image.createGraphics(); |
| UIUtil.drawHeader(g, 0, width, height, true, true, true, true); |
| g.dispose(); |
| return image; |
| } |
| |
| @Override |
| protected void paintChildren(Graphics g) { |
| Graphics2D graphics = (Graphics2D)g.create(); |
| UIUtil.applyRenderingHints(graphics); |
| super.paintChildren(graphics); |
| graphics.dispose(); |
| } |
| |
| @Override |
| public Dimension getPreferredSize() { |
| Dimension size = super.getPreferredSize(); |
| return new Dimension(size.width, TabsUtil.getTabsHeight()); |
| } |
| |
| @Override |
| public Dimension getMinimumSize() { |
| Dimension size = super.getMinimumSize(); |
| return new Dimension(size.width, TabsUtil.getTabsHeight()); |
| } |
| |
| void setAdditionalActions(@NotNull AnAction[] actions) { |
| myButtonPanel.removeAll(); |
| int actionCount = actions.length; |
| for (int i = 0; i < actionCount; i++) { |
| AnAction action = actions[i]; |
| if (action == null) { |
| continue; |
| } |
| myButtonPanel.add(new ActionButton(action)); |
| if (i < actionCount -1) { |
| myButtonPanel.add(Box.createHorizontalStrut(9)); |
| } |
| } |
| } |
| } |
| |
| private static class ActionButton extends Wrapper implements ActionListener { |
| private final InplaceButton myButton; |
| private final AnAction myAction; |
| |
| ActionButton(@NotNull AnAction action) { |
| myAction = action; |
| Icon icon = action.getTemplatePresentation().getIcon(); |
| Icon hoveredIcon = action.getTemplatePresentation().getHoveredIcon(); |
| if (hoveredIcon == null) { |
| hoveredIcon = icon; |
| } |
| |
| String toolTip = KeymapUtil.createTooltipText(action.getTemplatePresentation().getText(), action); |
| myButton = new InplaceButton(toolTip, icon, this); |
| |
| myButton.setIcons(icon, icon, hoveredIcon); |
| |
| myButton.setHoveringEnabled(!SystemInfo.isMac); |
| setContent(myButton); |
| setOpaque(false); |
| } |
| |
| @Override |
| public void actionPerformed(ActionEvent e) { |
| DataContext dataContext = DataManager.getInstance().getDataContext(this); |
| ActionManagerEx actionManager = ActionManagerEx.getInstanceEx(); |
| InputEvent inputEvent = e.getSource() instanceof InputEvent ? (InputEvent)e.getSource() : null; |
| //noinspection ConstantConditions |
| AnActionEvent event = |
| new AnActionEvent(inputEvent, dataContext, UNKNOWN, myAction.getTemplatePresentation(), ActionManager.getInstance(), 0); |
| actionManager.fireBeforeActionPerformed(myAction, dataContext, event); |
| myAction.actionPerformed(event); |
| } |
| } |
| } |