switcher - actions for simplw tool windows
[idea/community.git] / platform / platform-api / src / com / intellij / openapi / ui / SimpleToolWindowPanel.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.ui;
17
18 import com.intellij.openapi.actionSystem.ActionToolbar;
19 import com.intellij.openapi.actionSystem.AnAction;
20 import com.intellij.openapi.actionSystem.DataProvider;
21 import com.intellij.openapi.actionSystem.Separator;
22 import com.intellij.openapi.util.Ref;
23 import com.intellij.ui.switcher.QuickActionProvider;
24 import com.intellij.util.ui.AwtVisitor;
25 import com.intellij.util.ui.UIUtil;
26 import org.jetbrains.annotations.NonNls;
27
28 import javax.swing.*;
29 import java.awt.*;
30 import java.util.*;
31 import java.util.List;
32
33 public class SimpleToolWindowPanel extends JPanel implements QuickActionProvider, DataProvider {
34
35   private JComponent myToolbar;
36   private JComponent myContent;
37
38   private boolean myBorderless;
39   private boolean myVertical;
40   private boolean myProvideQuickActions;
41
42   public SimpleToolWindowPanel(boolean vertical) {
43     this(vertical, false);
44   }
45
46   public SimpleToolWindowPanel(boolean vertical, boolean borderless) {
47     setLayout(new BorderLayout(vertical ? 0 : 1, vertical ? 1 : 0));
48     myBorderless = borderless;
49     myVertical = vertical;
50     setProvideQuickActions(true);
51   }
52
53   public void setToolbar(JComponent c) {
54     myToolbar = c;
55
56     if (myVertical) {
57       add(c, BorderLayout.NORTH);
58     } else {
59       add(c, BorderLayout.WEST);
60     }
61
62     if (myBorderless) {
63       UIUtil.removeScrollBorder(c);
64     }
65
66     revalidate();
67     repaint();
68   }
69
70   public Object getData(@NonNls String dataId) {
71     return QuickActionProvider.KEY.is(dataId) && myProvideQuickActions ? this : null;
72   }
73
74   public SimpleToolWindowPanel setProvideQuickActions(boolean provide) {
75     myProvideQuickActions = provide;
76     return this;
77   }
78
79   public List<AnAction> getActions(boolean originalProvider) {
80     final Ref<ActionToolbar> toolbar = new Ref<ActionToolbar>();
81     if (myToolbar != null) {
82       new AwtVisitor(myToolbar) {
83         @Override
84         public boolean visit(Component component) {
85           if (component instanceof ActionToolbar) {
86             toolbar.set((ActionToolbar)component);
87             return true;
88           }
89           return false;
90         }
91       };
92     }
93
94     if (toolbar.get() != null) {
95       return toolbar.get().getActions(originalProvider);
96     }
97
98     return null;
99   }
100
101   public JComponent getComponent() {
102     return this;
103   }
104
105   public boolean isCycleRoot() {
106     return false;
107   }
108
109   public void setContent(JComponent c) {
110     myContent = c;
111     add(c, BorderLayout.CENTER);
112
113     if (myBorderless) {
114       UIUtil.removeScrollBorder(c);
115     }
116
117     revalidate();
118     repaint();
119   }
120
121   @Override
122   protected void paintComponent(final Graphics g) {
123     super.paintComponent(g);
124
125     if (myToolbar != null && myToolbar.getParent() == this && myContent != null && myContent.getParent() == this) {
126       g.setColor(UIUtil.getBorderSeparatorColor());
127       if (myVertical) {
128         final int y = (int)myToolbar.getBounds().getMaxY();
129         g.drawLine(0, y, getWidth(), y);
130       } else {
131         int x = (int)myToolbar.getBounds().getMaxX();
132         g.drawLine(x, 0, x, getHeight());
133       }
134     }
135   }
136 }