b523ce4af2112d7516bebb9eea60c4f6d8fd4c31
[idea/community.git] / python / educational-core / student / src / com / jetbrains / edu / learning / ui / StudyToolWindow.java
1 /*
2  * Copyright 2000-2015 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.jetbrains.edu.learning.ui;
17
18 import com.intellij.openapi.Disposable;
19 import com.intellij.openapi.actionSystem.ActionManager;
20 import com.intellij.openapi.actionSystem.ActionToolbar;
21 import com.intellij.openapi.actionSystem.DataProvider;
22 import com.intellij.openapi.actionSystem.DefaultActionGroup;
23 import com.intellij.openapi.diagnostic.Logger;
24 import com.intellij.openapi.fileEditor.FileEditorManagerListener;
25 import com.intellij.openapi.project.Project;
26 import com.intellij.openapi.ui.SimpleToolWindowPanel;
27 import com.intellij.ui.JBCardLayout;
28 import com.intellij.ui.OnePixelSplitter;
29 import com.intellij.util.ui.JBUI;
30 import com.jetbrains.edu.learning.StudyBasePluginConfigurator;
31 import com.jetbrains.edu.learning.StudyPluginConfigurator;
32 import com.jetbrains.edu.learning.StudyTaskManager;
33 import com.jetbrains.edu.learning.StudyUtils;
34 import com.jetbrains.edu.learning.courseFormat.Course;
35 import org.jetbrains.annotations.NotNull;
36
37 import javax.swing.*;
38 import java.awt.*;
39 import java.util.Map;
40
41 public abstract class StudyToolWindow extends SimpleToolWindowPanel implements DataProvider, Disposable {
42   private static final Logger LOG = Logger.getInstance(StudyToolWindow.class);
43   private static final String TASK_INFO_ID = "taskInfo";
44   private final JBCardLayout myCardLayout;
45   private final JPanel myContentPanel;
46   private final OnePixelSplitter mySplitPane;
47
48   public StudyToolWindow() {
49     super(true, true);
50     myCardLayout = new JBCardLayout();
51     myContentPanel = new JPanel(myCardLayout);
52     mySplitPane = new OnePixelSplitter(myVertical=true);
53   }
54
55   public void init(Project project) {
56     String taskText = StudyUtils.getTaskText(project);
57     if (taskText == null) return;
58
59     JPanel toolbarPanel = createToolbarPanel(project);
60     setToolbar(toolbarPanel);
61
62     myContentPanel.add(TASK_INFO_ID, createTaskInfoPanel(taskText, project));
63     mySplitPane.setFirstComponent(myContentPanel);
64     addAdditionalPanels(project);
65     myCardLayout.show(myContentPanel, TASK_INFO_ID);
66
67     setContent(mySplitPane);
68
69     StudyPluginConfigurator configurator = StudyUtils.getConfigurator(project);
70     if (configurator != null) {
71       final FileEditorManagerListener listener = configurator.getFileEditorManagerListener(project, this);
72       project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener);
73     }
74   }
75
76   private void addAdditionalPanels(Project project) {
77     StudyPluginConfigurator configurator = StudyUtils.getConfigurator(project);
78     if (configurator != null) {
79       Map<String, JPanel> panels = configurator.getAdditionalPanels(project);
80       for (Map.Entry<String, JPanel> entry : panels.entrySet()) {
81         myContentPanel.add(entry.getKey(), entry.getValue());
82       }
83     }
84     else {
85       LOG.warn("No StudyPluginConfigurator is provided for the plugin");
86     }
87   }
88
89   public void dispose() {
90   }
91   
92   //used in checkiO plugin.
93   @SuppressWarnings("unused")
94   public void showPanelById(@NotNull final String panelId) {
95     myCardLayout.swipe(myContentPanel, panelId, JBCardLayout.SwipeDirection.AUTO);
96   }
97
98   //used in checkiO plugin.
99   @SuppressWarnings("unused")
100   public void setBottomComponent(JComponent component) {
101     mySplitPane.setSecondComponent(component);
102   }
103
104   //used in checkiO plugin.
105   @SuppressWarnings("unused")
106   public JComponent getBottomComponent() {
107     return mySplitPane.getSecondComponent();
108   }
109
110   //used in checkiO plugin.
111   @SuppressWarnings("unused")
112   public void setTopComponentPrefferedSize(@NotNull final Dimension dimension) {
113     myContentPanel.setPreferredSize(dimension);
114   }
115
116   //used in checkiO plugin.
117   @SuppressWarnings("unused")
118   public JPanel getContentPanel() {
119     return myContentPanel;
120   }
121
122
123   public abstract JComponent createTaskInfoPanel(String taskText, Project project);
124
125   private static JPanel createToolbarPanel(@NotNull final Project project) {
126     final DefaultActionGroup group = getActionGroup(project);
127
128     final ActionToolbar actionToolBar = ActionManager.getInstance().createActionToolbar("Study", group, true);
129     return JBUI.Panels.simplePanel(actionToolBar.getComponent());
130   }
131
132   private static DefaultActionGroup getActionGroup(@NotNull final Project project) {
133     Course course = StudyTaskManager.getInstance(project).getCourse();
134     if (course == null) {
135       LOG.warn("Course is null");
136       return new DefaultActionGroup();
137     }
138     StudyPluginConfigurator configurator = StudyUtils.getConfigurator(project);
139     if (configurator != null) {
140       return configurator.getActionGroup(project);
141     }
142     else {
143       LOG.warn("No configurator is provided for plugin");
144       return StudyBasePluginConfigurator.getDefaultActionGroup();
145     }
146   }
147
148   public abstract void setTaskText(String text) ;
149 }