added idea support
[idea/community.git] / python / educational / interactive-learning / src / com / jetbrains / edu / learning / ui / StudyNewProjectPanel.java
1 package com.jetbrains.edu.learning.ui;
2
3 import com.intellij.facet.ui.FacetValidatorsManager;
4 import com.intellij.facet.ui.ValidationResult;
5 import com.intellij.icons.AllIcons;
6 import com.jetbrains.edu.learning.StudyUtils;
7 import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator;
8 import com.jetbrains.edu.stepic.CourseInfo;
9 import org.jetbrains.annotations.NotNull;
10
11 import javax.swing.*;
12 import java.awt.event.ActionEvent;
13 import java.awt.event.ActionListener;
14 import java.util.ArrayList;
15 import java.util.List;
16
17 /**
18  * author: liana
19  * data: 7/31/14.
20  */
21 public class StudyNewProjectPanel{
22   private List<CourseInfo> myAvailableCourses = new ArrayList<CourseInfo>();
23   private JComboBox myCoursesComboBox;
24   private JButton myRefreshButton;
25   private JPanel myContentPanel;
26   private JLabel myAuthorLabel;
27   private JLabel myDescriptionLabel;
28   private JLabel myLabel;
29   private JPanel myInfoPanel;
30   private final StudyProjectGenerator myGenerator;
31   private static final String CONNECTION_ERROR = "<html>Failed to download courses.<br>Check your Internet connection.</html>";
32   private static final String INVALID_COURSE = "Selected course is invalid";
33   private FacetValidatorsManager myValidationManager;
34
35   public StudyNewProjectPanel(StudyProjectGenerator generator) {
36     myGenerator = generator;
37     myAvailableCourses = myGenerator.getCourses();
38     if (myAvailableCourses.isEmpty()) {
39       setError(CONNECTION_ERROR);
40     }
41     else {
42       for (CourseInfo courseInfo : myAvailableCourses) {
43         myCoursesComboBox.addItem(courseInfo);
44       }
45       myAuthorLabel.setText("Author: " + StudyUtils.getFirst(myAvailableCourses).getAuthor());
46       myDescriptionLabel.setText(StudyUtils.getFirst(myAvailableCourses).getDescription());
47       //setting the first course in list as selected
48       myGenerator.setSelectedCourse(StudyUtils.getFirst(myAvailableCourses));
49       setOK();
50     }
51     initListeners();
52     myRefreshButton.setVisible(true);
53     myRefreshButton.setIcon(AllIcons.Actions.Refresh);
54
55     myLabel.setPreferredSize(new JLabel("Project name").getPreferredSize());
56   }
57
58   private void initListeners() {
59
60     myRefreshButton.addActionListener(new RefreshActionListener());
61     myCoursesComboBox.addActionListener(new CourseSelectedListener());
62   }
63
64   private void setError(@NotNull final String errorMessage) {
65     myGenerator.fireStateChanged(new ValidationResult(errorMessage));
66     if (myValidationManager != null) {
67       myValidationManager.validate();
68     }
69   }
70
71   private void setOK() {
72     myGenerator.fireStateChanged(ValidationResult.OK);
73     if (myValidationManager != null) {
74       myValidationManager.validate();
75     }
76   }
77
78   public JPanel getContentPanel() {
79     return myContentPanel;
80   }
81
82   public void registerValidators(final FacetValidatorsManager manager) {
83     myValidationManager = manager;
84   }
85
86
87   /**
88    * Handles refreshing courses
89    * Old courses added to new courses only if their
90    * meta file still exists in local file system
91    */
92   private class RefreshActionListener implements ActionListener {
93     @Override
94     public void actionPerformed(ActionEvent e) {
95       final List<CourseInfo> courses = myGenerator.getCourses();
96       if (courses.isEmpty()) {
97         setError(CONNECTION_ERROR);
98         return;
99       }
100       myCoursesComboBox.removeAllItems();
101
102       for (CourseInfo courseInfo : courses) {
103         myCoursesComboBox.addItem(courseInfo);
104       }
105       myGenerator.setSelectedCourse(StudyUtils.getFirst(courses));
106
107       myGenerator.setCourses(courses);
108       myAvailableCourses = courses;
109       myGenerator.flushCache();
110     }
111   }
112
113
114   /**
115    * Handles selecting course in combo box
116    * Sets selected course in combo box as selected in
117    * {@link StudyNewProjectPanel#myGenerator}
118    */
119   private class CourseSelectedListener implements ActionListener {
120     @Override
121     public void actionPerformed(ActionEvent e) {
122       JComboBox cb = (JComboBox)e.getSource();
123       CourseInfo selectedCourse = (CourseInfo)cb.getSelectedItem();
124       if (selectedCourse == null || selectedCourse.equals(CourseInfo.INVALID_COURSE)) {
125         myAuthorLabel.setText("");
126         myDescriptionLabel.setText("");
127         return;
128       }
129       myAuthorLabel.setText("Author: " + selectedCourse.getAuthor());
130       myCoursesComboBox.removeItem(CourseInfo.INVALID_COURSE);
131       myDescriptionLabel.setText(selectedCourse.getDescription());
132       myGenerator.setSelectedCourse(selectedCourse);
133       setOK();
134     }
135   }
136
137   public JComboBox getCoursesComboBox() {
138     return myCoursesComboBox;
139   }
140
141   public JPanel getInfoPanel() {
142     return myInfoPanel;
143   }
144 }