blob: 598d0f46ac746ddeb9251a913d591cf9378ef89f [file] [log] [blame]
/*
* Copyright 2000-2012 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.
*/
/*
* @author max
*/
package com.intellij.openapi.wm.impl.welcomeScreen;
import com.intellij.icons.AllIcons;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.impl.ActionButtonWithText;
import com.intellij.openapi.actionSystem.impl.PresentationFactory;
import com.intellij.openapi.ui.GraphicsConfig;
import com.intellij.openapi.util.IconLoader;
import com.intellij.ui.JBCardLayout;
import com.intellij.ui.JBColor;
import com.intellij.ui.LightColors;
import com.intellij.util.ui.CenteredIcon;
import com.intellij.util.ui.GraphicsUtil;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class CardActionsPanel extends JPanel {
private final boolean USE_ICONS = true;
private final JBCardLayout myLayout = new JBCardLayout();
private final JPanel myContent = new JPanel(myLayout);
private int nCards = 0;
public CardActionsPanel(ActionGroup rootGroup) {
setLayout(new GridLayout(1, 1));
add(myContent);
createCardForGroup(rootGroup, "root", null);
}
private void createCardForGroup(ActionGroup group, String cardId, final String parentId) {
JPanel card = new JPanel(new BorderLayout());
if (!USE_ICONS) {
card.setOpaque(false);
}
JPanel withBottomFiller = new JPanel(new BorderLayout());
if (!USE_ICONS) {
withBottomFiller.setOpaque(true);
withBottomFiller.setBackground(Color.white);
}
withBottomFiller.add(card, BorderLayout.NORTH);
myContent.add(withBottomFiller, cardId);
List<JComponent> components = buildComponents(group, cardId);
JPanel componentsPanel = new JPanel(new GridLayout(components.size(), 1, 5, 5));
if (!USE_ICONS) {
componentsPanel.setOpaque(false);
}
componentsPanel.setBorder(new EmptyBorder(15, 15, 15, 15));
for (JComponent component : components) {
componentsPanel.add(component);
}
card.add(componentsPanel, BorderLayout.CENTER);
String title;
title = group.getTemplatePresentation().getText();
card.add(new HeaderPanel(title, parentId), BorderLayout.NORTH);
}
private List<JComponent> buildComponents(ActionGroup group, String parentId) {
AnAction[] actions = group.getChildren(null);
List<JComponent> components = new ArrayList<JComponent>();
PresentationFactory factory = new PresentationFactory();
for (AnAction action : actions) {
Presentation presentation = action.getTemplatePresentation();
if (!USE_ICONS) {
presentation.setIcon(null);
}
if (action instanceof ActionGroup) {
ActionGroup childGroup = (ActionGroup)action;
if (childGroup.isPopup()) {
final String id = String.valueOf(++nCards);
createCardForGroup(childGroup, id, parentId);
components.add(new Button(new ActivateCard(id), presentation));
}
else {
components.addAll(buildComponents(childGroup, parentId));
}
}
else if (action instanceof AbstractActionWithPanel){
final JPanel panel = ((AbstractActionWithPanel)action).createPanel();
components.add(panel);
}
else {
action.update(new AnActionEvent(null, DataManager.getInstance().getDataContext(this),
ActionPlaces.WELCOME_SCREEN, presentation, ActionManager.getInstance(), 0));
if (presentation.isVisible()) {
components.add(new Button(action, presentation));
}
}
}
return components;
}
private class HeaderPanel extends JPanel {
private HeaderPanel(String text, final String parentId) {
super(new BorderLayout(5, 5));
setBackground(WelcomeScreenColors.CAPTION_BACKGROUND);
if (parentId != null) {
AnAction back = new AnAction("Back", null, AllIcons.Actions.Back) {
@Override
public void actionPerformed(AnActionEvent e) {
myLayout.swipe(myContent, parentId, JBCardLayout.SwipeDirection.BACKWARD);
}
};
ActionToolbar toolbar =
ActionManager.getInstance().createActionToolbar(ActionPlaces.CONTEXT_TOOLBAR, new DefaultActionGroup(back), true);
JComponent toolbarComponent = toolbar.getComponent();
toolbarComponent.setOpaque(false);
add(toolbarComponent, BorderLayout.WEST);
}
JLabel title = new JLabel(text);
title.setHorizontalAlignment(SwingConstants.CENTER);
title.setForeground(WelcomeScreenColors.CAPTION_FOREGROUND);
add(title, BorderLayout.CENTER);
setBorder(new BottomLineBorder());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(super.getPreferredSize().width, 28);
}
}
private static class Button extends ActionButtonWithText {
private static final Icon DEFAULT_ICON = new Icon() {
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(LightColors.SLIGHTLY_GREEN);
g.fillRoundRect(x + 4, y + 4, 32 - 8, 32 - 8, 8, 8);
g.setColor(JBColor.GRAY);
g.drawRoundRect(x + 4, y + 4, 32 - 8, 32 - 8, 8, 8);
}
@Override
public int getIconWidth() {
return 32;
}
@Override
public int getIconHeight() {
return 32;
}
};
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
AnAction action = getAction();
if (action instanceof ActivateCard) {
Rectangle bounds = getBounds();
Icon icon = AllIcons.Actions.Forward; //AllIcons.Icons.Ide.NextStepGrayed;
int y = (bounds.height - icon.getIconHeight()) / 2;
int x = bounds.width - icon.getIconWidth() - 15;
if (getPopState() == POPPED) {
final GraphicsConfig config = GraphicsUtil.setupAAPainting(g);
g.setColor(WelcomeScreenColors.CAPTION_BACKGROUND);
g.fillOval(x - 3, y - 3, icon.getIconWidth() + 6, icon.getIconHeight() + 6);
g.setColor(WelcomeScreenColors.GROUP_ICON_BORDER_COLOR);
g.drawOval(x - 3, y - 3, icon.getIconWidth() + 6, icon.getIconHeight() + 6);
config.restore();
}
else {
icon = IconLoader.getDisabledIcon(icon);
}
icon.paintIcon(this, g, x, y);
}
}
public Button(AnAction action, Presentation presentation) {
super(action,
wrapIcon(presentation),
ActionPlaces.WELCOME_SCREEN,
new Dimension(32, 32));
setBorder(new EmptyBorder(3, 3, 3, 3));
}
@Override
public String getToolTipText() {
return null;
}
@Override
protected int horizontalTextAlignment() {
return SwingConstants.LEFT;
}
@Override
protected int iconTextSpace() {
return 8;
}
private static Presentation wrapIcon(Presentation presentation) {
Icon original = presentation.getIcon();
CenteredIcon centered = new CenteredIcon(original != null ? original : DEFAULT_ICON, 40, 40, false);
presentation.setIcon(centered);
return presentation;
}
}
private class ActivateCard extends AnAction {
private final String myId;
public ActivateCard(String id) {
myId = id;
}
@Override
public void actionPerformed(AnActionEvent e) {
myLayout.swipe(myContent, myId, JBCardLayout.SwipeDirection.FORWARD);
}
}
}