585e30522962b431fd187585b684959b30420ba8
[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.ScrollPaneFactory;
9 import com.intellij.util.messages.MessageBusConnection;
10 import org.jetbrains.annotations.NotNull;
11 import org.jetbrains.annotations.Nullable;
12 import org.jetbrains.plugins.gradle.diff.GradleProjectStructureHelper;
13 import org.jetbrains.plugins.gradle.util.GradleBundle;
14 import org.jetbrains.plugins.gradle.ui.RichTextControlBuilder;
15
16 import javax.swing.*;
17 import java.awt.*;
18
19 /**
20  * Base class for high-level Gradle GUI controls used at the Gradle tool window. The basic idea is to encapsulate the same features in
21  * this class and allow to extend it via <code>Template Method</code> pattern. The shared features are listed below:
22  * <pre>
23  * <ul>
24  *   <li>provide common actions at the toolbar;</li>
25  *   <li>show info control when no gradle project is linked to the current IntelliJ IDEA project;</li>
26  * </ul>
27  * </pre>
28  * <p/>
29  * Not thread-safe.
30  * 
31  * @author Denis Zhdanov
32  * @since 12/26/11 5:19 PM
33  */
34 public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel {
35
36   private static final String NON_LINKED_CARD_NAME   = "NON_LINKED";
37   private static final String CONTENT_CARD_NAME      = "CONTENT";
38   private static final String TOOL_WINDOW_TOOLBAR_ID = "Gradle.ChangeActionsToolbar";
39
40   /** Show info control when no gradle project is linked, using {@link CardLayout} for that. */
41   private final CardLayout myLayout  = new CardLayout();
42   /** Top-level container, managed by the card layout. */
43   private final JPanel     myContent = new JPanel(myLayout);
44
45   private final Project                      myProject;
46   private final GradleProjectStructureHelper myProjectStructureHelper;
47   
48   protected GradleToolWindowPanel(@NotNull Project project,
49                                   @Nullable GradleProjectStructureHelper projectStructureHelper,
50                                   @NotNull String place)
51   {
52     super(true);
53     myProject = project;
54     myProjectStructureHelper = projectStructureHelper;
55     final ActionManager actionManager = ActionManager.getInstance();
56     final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(TOOL_WINDOW_TOOLBAR_ID);
57     ActionToolbar actionToolbar = actionManager.createActionToolbar(place, actionGroup, true);
58     setToolbar(actionToolbar.getComponent());
59     initContent();
60     setContent(myContent);
61     update();
62
63     MessageBusConnection connection = project.getMessageBus().connect(project);
64     connection.subscribe(GradleConfigNotifier.TOPIC, new GradleConfigNotifier() {
65       @Override
66       public void onLinkedProjectPathChange(@Nullable String oldPath, @Nullable String newPath) {
67         update();
68       }
69     });
70   }
71
72   private void initContent() {
73     final JComponent payloadControl = buildContent();
74     myContent.add(ScrollPaneFactory.createScrollPane(payloadControl), CONTENT_CARD_NAME);
75     RichTextControlBuilder builder = new RichTextControlBuilder();
76     builder.setBackgroundColor(payloadControl.getBackground());
77     builder.setForegroundColor(payloadControl.getForeground());
78     builder.setFont(payloadControl.getFont());
79     builder.setText(GradleBundle.message("gradle.toolwindow.text.no.linked.project"));
80     final JComponent noLinkedProjectControl = builder.build();
81     myContent.add(noLinkedProjectControl, NON_LINKED_CARD_NAME);
82   }
83
84   /**
85    * Asks current control to update its state.
86    */
87   public void update() {
88     final GradleSettings settings = GradleSettings.getInstance(myProject);
89     String cardToShow = settings.LINKED_PROJECT_FILE_PATH == null ? NON_LINKED_CARD_NAME : CONTENT_CARD_NAME;
90     myLayout.show(myContent, cardToShow);
91     
92     updateContent();
93   }
94
95   @NotNull
96   public Project getProject() {
97     return myProject;
98   }
99
100   @NotNull
101   public GradleProjectStructureHelper getProjectStructureHelper() {
102     return myProjectStructureHelper;
103   }
104
105   /**
106    * @return    GUI control to be displayed at the current tab
107    */
108   @NotNull
109   protected abstract JComponent buildContent();
110   
111   /**
112    * Callback for asking content control to update its state.
113    */
114   protected abstract void updateContent();
115 }