replaced <code></code> with more concise {@code}
[idea/community.git] / plugins / gradle / src / org / jetbrains / plugins / gradle / config / GradleToolWindowPanel.java
1 package org.jetbrains.plugins.gradle.config;
2
3 import com.intellij.openapi.actionSystem.ActionGroup;
4 import com.intellij.openapi.actionSystem.ActionManager;
5 import com.intellij.openapi.actionSystem.ActionToolbar;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.openapi.ui.SimpleToolWindowPanel;
8 import com.intellij.ui.IdeBorderFactory;
9 import com.intellij.ui.ScrollPaneFactory;
10 import com.intellij.ui.SideBorder;
11 import com.intellij.util.messages.MessageBusConnection;
12 import com.intellij.util.ui.UIUtil;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.plugins.gradle.settings.GradleSettings;
15 import org.jetbrains.plugins.gradle.settings.GradleSettingsListener;
16 import org.jetbrains.plugins.gradle.ui.RichTextControlBuilder;
17 import org.jetbrains.plugins.gradle.util.GradleBundle;
18
19 import javax.swing.*;
20 import java.awt.*;
21 import java.util.Collections;
22 import java.util.List;
23
24 /**
25  * Base class for high-level Gradle GUI controls used at the Gradle tool window. The basic idea is to encapsulate the same features in
26  * this class and allow to extend it via {@code Template Method} pattern. The shared features are listed below:
27  * <pre>
28  * <ul>
29  *   <li>provide common actions at the toolbar;</li>
30  *   <li>show info control when no gradle project is linked to the current IntelliJ IDEA project;</li>
31  * </ul>
32  * </pre>
33  * <p/>
34  * Not thread-safe.
35  * 
36  * @author Denis Zhdanov
37  * @since 12/26/11 5:19 PM
38  */
39 public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel {
40
41   private static final String NON_LINKED_CARD_NAME   = "NON_LINKED";
42   private static final String CONTENT_CARD_NAME      = "CONTENT";
43   private static final String TOOL_WINDOW_TOOLBAR_ID = "Gradle.ChangeActionsToolbar";
44
45   /** Show info control when no gradle project is linked, using {@link CardLayout} for that. */
46   private final CardLayout myLayout  = new CardLayout();
47   /** Top-level container, managed by the card layout. */
48   private final JPanel     myContent = new JPanel(myLayout);
49
50   private final Project myProject;
51   private final String  myPlace;
52
53   protected GradleToolWindowPanel(@NotNull Project project, @NotNull String place) {
54     super(true);
55     myProject = project;
56     myPlace = place;
57     setContent(myContent);
58
59     MessageBusConnection connection = project.getMessageBus().connect(project);
60     connection.subscribe(GradleSettingsListener.TOPIC, new GradleSettingsListenerAdapter() {
61       // TODO den implement
62 //      @Override public void onLinkedProjectConfigChange(@Nullable String oldPath, @Nullable String newPath) {
63 //        if (StringUtil.isEmpty(newPath)) {
64 //          myLayout.show(myContent, NON_LINKED_CARD_NAME);
65 //          return;
66 //        }
67 //        if (StringUtil.isEmpty(oldPath) && !StringUtil.isEmpty(newPath)) {
68 //          myLayout.show(myContent, CONTENT_CARD_NAME);
69 //        }
70 //      }
71     });
72   }
73
74   public void initContent() {
75     final ActionManager actionManager = ActionManager.getInstance();
76     final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(TOOL_WINDOW_TOOLBAR_ID);
77     ActionToolbar actionToolbar = actionManager.createActionToolbar(myPlace, actionGroup, true);
78     JPanel toolbarControl = new JPanel(new GridBagLayout());
79     GridBagConstraints constraints = new GridBagConstraints();
80     constraints.gridwidth = GridBagConstraints.REMAINDER;
81     constraints.weightx = 1;
82     constraints.fill = GridBagConstraints.HORIZONTAL;
83     constraints.anchor = GridBagConstraints.WEST;
84     toolbarControl.add(actionToolbar.getComponent(), constraints);
85     for (JComponent component : getToolbarControls()) {
86       component.setBorder(IdeBorderFactory.createBorder(SideBorder.TOP));
87       toolbarControl.add(component, constraints);
88     }
89     setToolbar(toolbarControl);
90     
91     final JComponent payloadControl = buildContent();
92     JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(payloadControl);
93     JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
94     myContent.add(scrollPane, CONTENT_CARD_NAME);
95     RichTextControlBuilder builder = new RichTextControlBuilder();
96     builder.setBackgroundColor(payloadControl.getBackground());
97     builder.setForegroundColor(UIUtil.getInactiveTextColor());
98     builder.setFont(payloadControl.getFont());
99     builder.setText(GradleBundle.message("gradle.toolwindow.text.no.linked.project"));
100     final JComponent noLinkedProjectControl = builder.build();
101     myContent.add(noLinkedProjectControl, NON_LINKED_CARD_NAME);
102     update();
103   }
104
105   /**
106    * @return    list of UI controls to be displayed vertically at the toolbar
107    */
108   @NotNull
109   protected List<JComponent> getToolbarControls() {
110     return Collections.emptyList();
111   }
112   
113   /**
114    * Asks current control to update its state.
115    */
116   public void update() {
117     final GradleSettings settings = GradleSettings.getInstance(myProject);
118     // TODO den implement
119     String cardToShow = "sf";
120 //    String cardToShow = StringUtil.isEmpty(settings.getLinkedExternalProjectPath()) ? NON_LINKED_CARD_NAME : CONTENT_CARD_NAME;
121     myLayout.show(myContent, cardToShow);
122     boolean showToolbar = cardToShow != NON_LINKED_CARD_NAME;
123     for (JComponent component : getToolbarControls()) {
124       component.setVisible(showToolbar);
125     }
126   }
127
128   @NotNull
129   public Project getProject() {
130     return myProject;
131   }
132
133   /**
134    * @return    GUI control to be displayed at the current tab
135    */
136   @NotNull
137   protected abstract JComponent buildContent();
138   
139   /**
140    * Callback for asking content control to update its state.
141    */
142   protected abstract void updateContent();
143 }