EDU-543 IAE in StudyBrowser if several projects opened
[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.FileEditorManager;
25 import com.intellij.openapi.fileEditor.FileEditorManagerListener;
26 import com.intellij.openapi.project.Project;
27 import com.intellij.openapi.ui.SimpleToolWindowPanel;
28 import com.intellij.openapi.vfs.VirtualFile;
29 import com.intellij.ui.JBCardLayout;
30 import com.intellij.ui.OnePixelSplitter;
31 import com.intellij.util.ui.JBUI;
32 import com.jetbrains.edu.courseFormat.Course;
33 import com.jetbrains.edu.courseFormat.Task;
34 import com.jetbrains.edu.courseFormat.TaskFile;
35 import com.jetbrains.edu.learning.StudyTaskManager;
36 import com.jetbrains.edu.learning.StudyToolWindowConfigurator;
37 import com.jetbrains.edu.learning.StudyUtils;
38 import org.jetbrains.annotations.NotNull;
39
40 import javax.swing.*;
41 import java.awt.*;
42 import java.util.Map;
43
44 public abstract class StudyToolWindow extends SimpleToolWindowPanel implements DataProvider, Disposable {
45   private static final Logger LOG = Logger.getInstance(StudyToolWindow.class);
46   private static final String EMPTY_TASK_TEXT = "Please, open any task to see task description";
47   private static final String TASK_INFO_ID = "taskInfo";
48   private final JBCardLayout myCardLayout;
49   private final JPanel myContentPanel;
50   private final OnePixelSplitter mySplitPane;
51
52   public StudyToolWindow() {
53     super(true, true);
54     myCardLayout = new JBCardLayout();
55     myContentPanel = new JPanel(myCardLayout);
56     mySplitPane = new OnePixelSplitter(myVertical=true);
57   }
58
59   public void init(Project project) {
60     String taskText = getTaskText(project);
61     if (taskText == null) return;
62
63     JPanel toolbarPanel = createToolbarPanel(project);
64     setToolbar(toolbarPanel);
65
66     myContentPanel.add(TASK_INFO_ID, createTaskInfoPanel(taskText, project));
67     mySplitPane.setFirstComponent(myContentPanel);
68     addAdditionalPanels(project);
69     myCardLayout.show(myContentPanel, TASK_INFO_ID);
70
71     setContent(mySplitPane);
72
73     StudyToolWindowConfigurator configurator = StudyUtils.getConfigurator(project);
74     assert configurator != null;
75     final FileEditorManagerListener listener = configurator.getFileEditorManagerListener(project, this);
76     project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener);
77   }
78
79   private void addAdditionalPanels(Project project) {
80     StudyToolWindowConfigurator configurator = StudyUtils.getConfigurator(project);
81     assert configurator != null;
82     Map<String, JPanel> panels = configurator.getAdditionalPanels(project);
83     for (Map.Entry<String, JPanel> entry: panels.entrySet()) {
84       myContentPanel.add(entry.getKey(), entry.getValue());
85     }
86   }
87
88   public void dispose() {
89   }
90   
91   //used in checkiO plugin.
92   @SuppressWarnings("unused")
93   public void showPanelById(@NotNull final String panelId) {
94     myCardLayout.swipe(myContentPanel, panelId, JBCardLayout.SwipeDirection.AUTO);
95   }
96
97   //used in checkiO plugin.
98   @SuppressWarnings("unused")
99   public void setBottomComponent(JComponent component) {
100     mySplitPane.setSecondComponent(component);
101   }
102
103   //used in checkiO plugin.
104   @SuppressWarnings("unused")
105   public JComponent getBottomComponent() {
106     return mySplitPane.getSecondComponent();
107   }
108
109   //used in checkiO plugin.
110   @SuppressWarnings("unused")
111   public void setTopComponentPrefferedSize(@NotNull final Dimension dimension) {
112     myContentPanel.setPreferredSize(dimension);
113   }
114
115   //used in checkiO plugin.
116   @SuppressWarnings("unused")
117   public JPanel getContentPanel() {
118     return myContentPanel;
119   }
120   
121   
122   private static String getTaskText(@NotNull final Project project) {
123     VirtualFile[] files = FileEditorManager.getInstance(project).getSelectedFiles();
124     TaskFile taskFile = null;
125     for (VirtualFile file : files) {
126       taskFile = StudyUtils.getTaskFile(project, file);
127       if (taskFile != null) {
128         break;
129       }
130     }
131     if (taskFile == null) {
132       return EMPTY_TASK_TEXT;
133     }
134     final Task task = taskFile.getTask();
135     if (task != null) {
136       return StudyUtils.getTaskTextFromTask(task, task.getTaskDir(project));
137     }
138     return null;
139   }
140   
141   public abstract JComponent createTaskInfoPanel(String taskText, Project project);
142
143   private static JPanel createToolbarPanel(@NotNull final Project project) {
144     final DefaultActionGroup group = getActionGroup(project);
145
146     final ActionToolbar actionToolBar = ActionManager.getInstance().createActionToolbar("Study", group, true);
147     return JBUI.Panels.simplePanel(actionToolBar.getComponent());
148   }
149
150   private static DefaultActionGroup getActionGroup(@NotNull final Project project) {
151     Course course = StudyTaskManager.getInstance(project).getCourse();
152     if (course == null) {
153       LOG.warn("Course is null");
154       return new DefaultActionGroup();
155     }
156     StudyToolWindowConfigurator configurator = StudyUtils.getConfigurator(project);
157     assert configurator != null;
158
159     return configurator.getActionGroup(project);
160   }
161
162   public abstract void setTaskText(String text) ;
163 }