From d1cded05724b7540dba71056b703abe66d340c1d Mon Sep 17 00:00:00 2001 From: meanmail Date: Sat, 11 Mar 2017 22:18:39 +0700 Subject: [PATCH 01/55] Added auth dialog --- .../learning/stepik/StepikConnectorLogin.java | 43 +++++- .../org/stepik/plugin/auth/ui/AuthDialog.java | 128 ++++++++++++++++++ .../ui/ProjectSettingsPanel.java | 3 +- 3 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index e00fec55..a62eac71 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -16,15 +16,28 @@ import org.stepik.api.objects.auth.TokenInfo; import org.stepik.api.objects.users.User; import org.stepik.core.metrics.Metrics; +import org.stepik.plugin.auth.ui.AuthDialog; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; + +import static java.nio.charset.StandardCharsets.UTF_8; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; public class StepikConnectorLogin { private static final Logger logger = Logger.getInstance(StepikConnectorLogin.class); - private static final String CLIENT_ID = "hUCWcq3hZHCmz0DKrDtwOWITLcYutzot7p4n59vU"; + private static final String CLIENT_ID = "vV8giW7KTPMOTriOUBwyGLvXbKV0Cc4GPBnyCJPd"; + private static final String REDIRECT_URI = "https://stepik.org"; private static final String LAST_USER_PROPERTY_NAME = PLUGIN_ID + ".LAST_USER"; private static final StepikApiClient stepikApiClient = initStepikApiClient(); + private static final String IMPLICIT_GRANT_URL_TEMPLATE = "https://stepik.org/oauth2/authorize/" + + "?client_id=" + CLIENT_ID + + "&redirect_uri=%s" + + "&scope=write" + + "&state=%s" + + "&response_type=token"; private static long getLastUser() { return PropertiesComponent.getInstance().getOrInitLong(LAST_USER_PROPERTY_NAME, 0); @@ -68,15 +81,21 @@ private static StepikApiClient initStepikApiClient() { public static void authentication() { AuthInfo authInfo = getAuthInfo(getLastUser()); if (!minorLogin(authInfo)) { - showAuthDialog(); + showAuthDialog(false); } } - private static void showAuthDialog() { + private static void showAuthDialog(boolean clear) { ApplicationManager.getApplication().invokeAndWait(() -> { logger.info("Show the authentication dialog"); - final LoginDialog dialog = new LoginDialog(); - dialog.show(); + Map map = AuthDialog.showAuthForm(clear); + + TokenInfo tokenInfo = stepikApiClient.getTokenInfo(); + tokenInfo.setAccessToken(map.get("access_token")); + tokenInfo.setExpiresIn(Integer.valueOf(map.getOrDefault("expires_in", "0"))); + tokenInfo.setScope(map.get("scope")); + tokenInfo.setTokenType(map.get("token_type")); + tokenInfo.setRefreshToken(null); }, ModalityState.defaultModalityState()); } @@ -254,4 +273,18 @@ public static void logout() { logger.info("Logout successfully"); } } + + @Nullable + public static String getImplicitGrantUrl() { + try { + return String.format(IMPLICIT_GRANT_URL_TEMPLATE, URLEncoder.encode(REDIRECT_URI, UTF_8.name()), "1234"); + } catch (UnsupportedEncodingException e) { + return null; + } + } + + public static void logoutAndAuth() { + logout(); + showAuthDialog(true); + } } \ No newline at end of file diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java new file mode 100644 index 00000000..cdc3cb67 --- /dev/null +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -0,0 +1,128 @@ +package org.stepik.plugin.auth.ui; + +import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.concurrent.Worker; +import javafx.embed.swing.JFXPanel; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.ProgressBar; +import javafx.scene.layout.StackPane; +import javafx.scene.web.WebEngine; +import javafx.scene.web.WebView; +import org.stepik.api.urls.Urls; + +import javax.swing.*; +import java.awt.*; +import java.net.CookieHandler; +import java.net.CookieManager; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author meanmail + */ +public class AuthDialog extends JDialog { + private final Map map = new HashMap<>(); + private WebEngine engine; + private WebView webComponent; + private Node progressBar; + private JFXPanel panel; + + private AuthDialog(boolean clear) { + super((Frame) null, true); + setTitle("Authorize"); + setSize(new Dimension(640, 480)); + setLocationRelativeTo(null); + setLayout(new BorderLayout()); + setPanel(new JFXPanel()); + Platform.runLater(() -> { + StackPane pane = new StackPane(); + webComponent = new WebView(); + engine = webComponent.getEngine(); + progressBar = makeProgressBarWithListener(); + webComponent.setVisible(false); + pane.getChildren().addAll(webComponent, progressBar); + Scene scene = new Scene(pane); + panel.setScene(scene); + panel.setVisible(true); + + if (clear) { + CookieManager manager = new CookieManager(); + CookieHandler.setDefault(manager); + manager.getCookieStore().removeAll(); + } + String url = StepikConnectorLogin.getImplicitGrantUrl(); + engine.load(url); + }); + add(panel, BorderLayout.CENTER); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + } + + public static Map showAuthForm(boolean clear) { + AuthDialog instance = new AuthDialog(clear); + instance.setVisible(true); + return instance.map; + } + + private ProgressBar makeProgressBarWithListener() { + final ProgressBar progress = new ProgressBar(); + Worker loadWorker = engine.getLoadWorker(); + progress.progressProperty().bind(loadWorker.progressProperty()); + + loadWorker.stateProperty().addListener( + new ChangeListener() { + @Override + public void changed( + ObservableValue ov, + Worker.State oldState, + Worker.State newState) { + if (newState == Worker.State.CANCELLED) { + return; + } + String location = engine.getLocation(); + System.out.println(location); + if (location != null) { + if (location.startsWith(Urls.STEPIK_URL + "/#")) { + String paramString = location.split("#")[1]; + String[] params = paramString.split("&"); + map.clear(); + Arrays.stream(params).forEach(param -> { + String[] entry = param.split("="); + String value = ""; + if (entry.length > 0) { + value = entry[1]; + } + map.put(entry[0], value); + }); + hide(); + return; + } else if ((Urls.STEPIK_URL + "/?error=access_denied").equals(location)) { + hide(); + return; + } + } + + if (newState == Worker.State.SUCCEEDED) { + progressBar.setVisible(false); + webComponent.setVisible(true); + AuthDialog.this.setTitle(engine.getTitle()); + } + } + + private void hide() { + loadWorker.cancel(); + setVisible(false); + } + }); + + return progress; + } + + private void setPanel(JFXPanel panel) { + this.panel = panel; + } +} diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java index 9c3b8a04..4599271a 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java @@ -44,8 +44,7 @@ public ProjectSettingsPanel(@NotNull Project project, boolean visibleLangBox) { mainPanel.addHierarchyListener(this); logoutButton.addActionListener(e -> { - StepikConnectorLogin.logout(); - StepikConnectorLogin.authentication(); + StepikConnectorLogin.logoutAndAuth(); setUsername(); }); } From c3d9016bcdc2efe56af9be725a5387b89be7bafc Mon Sep 17 00:00:00 2001 From: meanmail Date: Sat, 11 Mar 2017 22:27:05 +0700 Subject: [PATCH 02/55] Removed login dialog --- .../tmp/learning/stepik/LoginDialog.java | 90 ------------------- .../jetbrains/tmp/learning/ui/LoginPanel.form | 59 ------------ .../jetbrains/tmp/learning/ui/LoginPanel.java | 66 -------------- .../org/stepik/plugin/auth/ui/AuthDialog.java | 2 +- 4 files changed, 1 insertion(+), 216 deletions(-) delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java deleted file mode 100644 index 614f6bf1..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.jetbrains.tmp.learning.stepik; - -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.util.ThrowableComputable; -import com.intellij.openapi.util.text.StringUtil; -import com.jetbrains.tmp.learning.ui.LoginPanel; -import org.jetbrains.annotations.NotNull; -import org.stepik.api.exceptions.StepikClientException; -import org.stepik.api.exceptions.StepikUnauthorizedException; -import org.stepik.core.utils.Utils; - -import javax.swing.*; - -public class LoginDialog extends DialogWrapper { - private final LoginPanel loginPanel; - - LoginDialog() { - super(false); - loginPanel = new LoginPanel(this); - setTitle("Authentication at Stepik"); - setOKButtonText("Login"); - init(); - } - - @NotNull - protected Action[] createActions() { - return new Action[]{getOKAction(), getCancelAction()}; - } - - @Override - protected JComponent createCenterPanel() { - return loginPanel.getContentPanel(); - } - - @Override - protected String getHelpId() { - return "login_to_stepik"; - } - - @Override - public JComponent getPreferredFocusedComponent() { - return loginPanel.getPreferableFocusComponent(); - } - - @Override - protected void doOKAction() { - if (!validateLoginAndPasswordFields()) { - return; - } - - try { - String login = loginPanel.getLogin(); - String password = loginPanel.getPassword(); - - ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - StepikConnectorLogin.authenticate(login, password); - return null; - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - doJustOkAction(); - } catch (StepikUnauthorizedException e) { - setErrorText("Wrong a login or a password"); - } catch (StepikClientException e) { - setErrorText("Connection failed"); - } - } - - private boolean validateLoginAndPasswordFields() { - if (StringUtil.isEmptyOrSpaces(loginPanel.getLogin())) { - setErrorText("Please, enter your username"); - return false; - } - if (StringUtil.isEmptyOrSpaces(loginPanel.getPassword())) { - setErrorText("Please, enter your password"); - return false; - } - return true; - } - - private void doJustOkAction() { - super.doOKAction(); - } - - public void clearErrors() { - setErrorText(null); - } -} \ No newline at end of file diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form b/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form deleted file mode 100644 index 5bbc0864..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form +++ /dev/null @@ -1,59 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java deleted file mode 100644 index aea95b45..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jetbrains.tmp.learning.ui; - -import com.intellij.ide.BrowserUtil; -import com.intellij.ui.DocumentAdapter; -import com.intellij.ui.components.JBLabel; -import com.jetbrains.tmp.learning.stepik.EduStepikNames; -import com.jetbrains.tmp.learning.stepik.LoginDialog; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -public class LoginPanel { - private JPanel contentPanel; - private JPasswordField passwordField; - private JTextField loginField; - private JBLabel signUpLabel; - - public LoginPanel(final LoginDialog dialog) { - DocumentListener listener = new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - dialog.clearErrors(); - } - }; - - loginField.getDocument().addDocumentListener(listener); - passwordField.getDocument().addDocumentListener(listener); - - signUpLabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - BrowserUtil.browse(EduStepikNames.STEPIK_SIGN_IN_LINK); - } - - @Override - public void mouseEntered(MouseEvent e) { - e.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - - @Override - public void mouseExited(MouseEvent e) { - e.getComponent().setCursor(Cursor.getDefaultCursor()); - } - }); - } - - public JPanel getContentPanel() { - return contentPanel; - } - - public String getPassword() { - return String.valueOf(passwordField.getPassword()); - } - - public String getLogin() { - return loginField.getText(); - } - - public JComponent getPreferableFocusComponent() { - return loginField; - } -} diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index cdc3cb67..0dc66032 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -84,7 +84,7 @@ public void changed( return; } String location = engine.getLocation(); - System.out.println(location); + if (location != null) { if (location.startsWith(Urls.STEPIK_URL + "/#")) { String paramString = location.split("#")[1]; From 179c26d23a78234bfe57a01feb0365a450ea5b43 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 00:14:28 +0700 Subject: [PATCH 03/55] Show error page when connection failed --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 10 +++++ core/src/main/resources/templates/error.ftl | 45 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 core/src/main/resources/templates/error.ftl diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 0dc66032..b6df9267 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -13,6 +13,7 @@ import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import org.stepik.api.urls.Urls; +import org.stepik.core.templates.Templater; import javax.swing.*; import java.awt.*; @@ -83,6 +84,15 @@ public void changed( if (newState == Worker.State.CANCELLED) { return; } + + if (newState == Worker.State.FAILED) { + Map map = new HashMap<>(); + map.put("url", engine.getLocation()); + String content = Templater.processTemplate("error", map); + engine.loadContent(content); + return; + } + String location = engine.getLocation(); if (location != null) { diff --git a/core/src/main/resources/templates/error.ftl b/core/src/main/resources/templates/error.ftl new file mode 100644 index 00000000..f75f879a --- /dev/null +++ b/core/src/main/resources/templates/error.ftl @@ -0,0 +1,45 @@ +<#-- @ftlvariable name="url" type="java.lang.String" --> + + + + Error + + + + +

Connection failed

+
+
    +
  • Check internet connection options
  • +
+ +Try again + + \ No newline at end of file From a3f848ca8d7c814d66c914b8e168230f1c1f07fa Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 01:45:56 +0700 Subject: [PATCH 04/55] Added goBack button --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 58 ++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index b6df9267..5fe37fb4 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -1,22 +1,32 @@ package org.stepik.plugin.auth.ui; +import com.intellij.icons.AllIcons; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.embed.swing.JFXPanel; +import javafx.embed.swing.SwingFXUtils; +import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Scene; +import javafx.scene.control.Button; import javafx.scene.control.ProgressBar; -import javafx.scene.layout.StackPane; +import javafx.scene.image.ImageView; +import javafx.scene.image.WritableImage; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; import javafx.scene.web.WebEngine; +import javafx.scene.web.WebHistory; import javafx.scene.web.WebView; import org.stepik.api.urls.Urls; import org.stepik.core.templates.Templater; import javax.swing.*; import java.awt.*; +import java.awt.image.BufferedImage; import java.net.CookieHandler; import java.net.CookieManager; import java.util.Arrays; @@ -29,7 +39,6 @@ public class AuthDialog extends JDialog { private final Map map = new HashMap<>(); private WebEngine engine; - private WebView webComponent; private Node progressBar; private JFXPanel panel; @@ -40,17 +49,26 @@ private AuthDialog(boolean clear) { setLocationRelativeTo(null); setLayout(new BorderLayout()); setPanel(new JFXPanel()); + Platform.runLater(() -> { - StackPane pane = new StackPane(); - webComponent = new WebView(); + BorderPane pane = new BorderPane(); + HBox toolPane = new HBox(); + toolPane.setSpacing(5); + toolPane.setAlignment(Pos.CENTER_LEFT); + WebView webComponent = new WebView(); engine = webComponent.getEngine(); progressBar = makeProgressBarWithListener(); - webComponent.setVisible(false); - pane.getChildren().addAll(webComponent, progressBar); + pane.setTop(toolPane); + pane.setCenter(webComponent); Scene scene = new Scene(pane); panel.setScene(scene); panel.setVisible(true); + Button backButton = makeGoBackButton(); + addButtonsAvailabilityListeners(backButton); + toolPane.getChildren().addAll(backButton, progressBar); + toolPane.setPadding(new Insets(5)); + if (clear) { CookieManager manager = new CookieManager(); CookieHandler.setDefault(manager); @@ -69,6 +87,30 @@ public static Map showAuthForm(boolean clear) { return instance.map; } + private void addButtonsAvailabilityListeners(Button goBackButton) { + Platform.runLater(() -> engine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> { + if (newState == Worker.State.SUCCEEDED) { + WebHistory history = engine.getHistory(); + boolean isGoBackDisable = history.getCurrentIndex() <= 0; + goBackButton.setDisable(isGoBackDisable); + } + })); + } + + private Button makeGoBackButton() { + Icon icon = AllIcons.Actions.Back; + BufferedImage bImg = new BufferedImage(icon.getIconWidth(), icon.getIconWidth(), BufferedImage.TYPE_INT_ARGB); + Graphics2D graphics = bImg.createGraphics(); + icon.paintIcon(null, graphics, 0, 0); + graphics.dispose(); + WritableImage image = SwingFXUtils.toFXImage(bImg, null); + final Button button = new Button(null, new ImageView(image)); + button.setDisable(true); + button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); + + return button; + } + private ProgressBar makeProgressBarWithListener() { final ProgressBar progress = new ProgressBar(); Worker loadWorker = engine.getLoadWorker(); @@ -116,9 +158,9 @@ public void changed( } } + progressBar.setVisible(newState == Worker.State.RUNNING); + if (newState == Worker.State.SUCCEEDED) { - progressBar.setVisible(false); - webComponent.setVisible(true); AuthDialog.this.setTitle(engine.getTitle()); } } From 5fc98bac66fcae9cd2b9ad42ef87f3e71ae83bec Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 14:50:29 +0700 Subject: [PATCH 05/55] Added home button --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 5fe37fb4..8426bdce 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -21,6 +21,7 @@ import javafx.scene.web.WebEngine; import javafx.scene.web.WebHistory; import javafx.scene.web.WebView; +import org.jetbrains.annotations.NotNull; import org.stepik.api.urls.Urls; import org.stepik.core.templates.Templater; @@ -38,6 +39,7 @@ */ public class AuthDialog extends JDialog { private final Map map = new HashMap<>(); + private String url; private WebEngine engine; private Node progressBar; private JFXPanel panel; @@ -66,7 +68,8 @@ private AuthDialog(boolean clear) { Button backButton = makeGoBackButton(); addButtonsAvailabilityListeners(backButton); - toolPane.getChildren().addAll(backButton, progressBar); + Button homeButton = makeHomeButton(); + toolPane.getChildren().addAll(backButton, homeButton, progressBar); toolPane.setPadding(new Insets(5)); if (clear) { @@ -74,7 +77,7 @@ private AuthDialog(boolean clear) { CookieHandler.setDefault(manager); manager.getCookieStore().removeAll(); } - String url = StepikConnectorLogin.getImplicitGrantUrl(); + url = StepikConnectorLogin.getImplicitGrantUrl(); engine.load(url); }); add(panel, BorderLayout.CENTER); @@ -98,17 +101,28 @@ private void addButtonsAvailabilityListeners(Button goBackButton) { } private Button makeGoBackButton() { - Icon icon = AllIcons.Actions.Back; + Button button = createButtonWithImage(AllIcons.Actions.Back); + button.setDisable(true); + button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); + + return button; + } + + private Button makeHomeButton() { + Button button = createButtonWithImage(AllIcons.Actions.Refresh); + button.setOnAction(event -> Platform.runLater(() -> engine.load(url))); + + return button; + } + + @NotNull + private Button createButtonWithImage(@NotNull Icon icon) { BufferedImage bImg = new BufferedImage(icon.getIconWidth(), icon.getIconWidth(), BufferedImage.TYPE_INT_ARGB); Graphics2D graphics = bImg.createGraphics(); icon.paintIcon(null, graphics, 0, 0); graphics.dispose(); WritableImage image = SwingFXUtils.toFXImage(bImg, null); - final Button button = new Button(null, new ImageView(image)); - button.setDisable(true); - button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); - - return button; + return new Button(null, new ImageView(image)); } private ProgressBar makeProgressBarWithListener() { From 4b6330aa770ec6529dc9ffc2bddef200ea82f1ee Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 16:30:31 +0700 Subject: [PATCH 06/55] Removed login with password from settings --- .../tmp/learning/stepik/AuthInfo.java | 51 ------ .../learning/stepik/StepikConnectorLogin.java | 117 +++---------- .../collective/ui/StepikSettingsPanel.form | 89 +++------- .../collective/ui/StepikSettingsPanel.java | 165 ++---------------- 4 files changed, 65 insertions(+), 357 deletions(-) delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java deleted file mode 100644 index 74443a73..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.jetbrains.tmp.learning.stepik; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.stepik.api.objects.auth.TokenInfo; - -/** - * @author meanmail - */ -class AuthInfo { - private TokenInfo tokenInfo; - private String password; - private String username; - - @Nullable - TokenInfo getTokenInfo() { - return tokenInfo; - } - - void setTokenInfo(@Nullable TokenInfo tokenInfo) { - this.tokenInfo = tokenInfo; - } - - @NotNull - String getPassword() { - if (password == null) { - password = ""; - } - return password; - } - - void setPassword(@Nullable String password) { - this.password = password; - } - - @NotNull - String getUsername() { - if (username == null) { - username = ""; - } - return username; - } - - void setUsername(@Nullable String username) { - this.username = username; - } - - boolean canBeValid() { - return username != null && !username.isEmpty() && password != null && !password.isEmpty(); - } -} diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index a62eac71..334b72b8 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -62,9 +62,9 @@ private static StepikApiClient initStepikApiClient() { long lastUserId = getLastUser(); - AuthInfo authInfo = getAuthInfo(lastUserId, client); + TokenInfo tokenInfo = getTokenInfo(lastUserId, client); - client.setTokenInfo(authInfo.getTokenInfo()); + client.setTokenInfo(tokenInfo); return client; } @@ -78,9 +78,9 @@ private static StepikApiClient initStepikApiClient() { *
  • Show a dialog box for getting an username and a password
  • * */ - public static void authentication() { - AuthInfo authInfo = getAuthInfo(getLastUser()); - if (!minorLogin(authInfo)) { + public static synchronized void authentication() { + TokenInfo tokenInfo = getTokenInfo(getLastUser()); + if (!minorLogin(tokenInfo)) { showAuthDialog(false); } } @@ -90,16 +90,20 @@ private static void showAuthDialog(boolean clear) { logger.info("Show the authentication dialog"); Map map = AuthDialog.showAuthForm(clear); - TokenInfo tokenInfo = stepikApiClient.getTokenInfo(); + TokenInfo tokenInfo = new TokenInfo(); tokenInfo.setAccessToken(map.get("access_token")); tokenInfo.setExpiresIn(Integer.valueOf(map.getOrDefault("expires_in", "0"))); tokenInfo.setScope(map.get("scope")); tokenInfo.setTokenType(map.get("token_type")); - tokenInfo.setRefreshToken(null); + tokenInfo.setRefreshToken(map.get("refresh_token")); + stepikApiClient.setTokenInfo(tokenInfo); + if (tokenInfo.getAccessToken() != null) { + Metrics.authenticate(SUCCESSFUL); + } }, ModalityState.defaultModalityState()); } - private static boolean minorLogin(@NotNull AuthInfo authInfo) { + private static boolean minorLogin(@NotNull TokenInfo tokenInfo) { logger.info("Check the authentication"); if (stepikApiClient.getTokenInfo().getAccessToken() != null) { @@ -112,8 +116,8 @@ private static boolean minorLogin(@NotNull AuthInfo authInfo) { } String refreshToken = stepikApiClient.getTokenInfo().getRefreshToken(); - if (refreshToken == null && authInfo.getTokenInfo() != null) { - refreshToken = authInfo.getTokenInfo().getRefreshToken(); + if (refreshToken == null) { + refreshToken = tokenInfo.getRefreshToken(); } if (refreshToken != null) { @@ -129,29 +133,18 @@ private static boolean minorLogin(@NotNull AuthInfo authInfo) { } } - if (authInfo.canBeValid()) { - try { - logger.info("Try execute the Authentication with a password"); - authenticate(authInfo.getUsername(), authInfo.getPassword()); - logger.info("The Authentication with a password is successfully"); - return true; - } catch (StepikClientException e) { - logger.info("The Authentication with a password failed: " + e.getMessage()); - } - } - return false; } @NotNull - private static AuthInfo getAuthInfo(long userId) { - return getAuthInfo(userId, stepikApiClient); + private static TokenInfo getTokenInfo(long userId) { + return getTokenInfo(userId, stepikApiClient); } @NotNull - private static AuthInfo getAuthInfo(long userId, StepikApiClient client) { + private static TokenInfo getTokenInfo(long userId, StepikApiClient client) { if (userId == 0) { - return new AuthInfo(); + return new TokenInfo(); } String serviceName = StepikProjectManager.class.getName(); CredentialAttributes attributes = new CredentialAttributes(serviceName, @@ -162,27 +155,21 @@ private static AuthInfo getAuthInfo(long userId, StepikApiClient client) { synchronized (StepikConnectorLogin.class) { serializedAuthInfo = PasswordSafe.getInstance().getPassword(attributes); } - AuthInfo authInfo = client.getJsonConverter().fromJson(serializedAuthInfo, AuthInfo.class); + TokenInfo authInfo = client.getJsonConverter().fromJson(serializedAuthInfo, TokenInfo.class); if (authInfo == null) { - return new AuthInfo(); + return new TokenInfo(); } return authInfo; } - @NotNull - public static String getCurrentUserPassword() { - User currentUser = getCurrentUser(); - return getAuthInfo(currentUser.getId()).getPassword(); - } - - private static void setAuthInfo(long userId, @NotNull final AuthInfo authInfo) { + private static void setAuthInfo(long userId, @NotNull final TokenInfo tokenInfo) { String serviceName = StepikProjectManager.class.getName(); CredentialAttributes attributes = new CredentialAttributes(serviceName, String.valueOf(userId), StepikProjectManager.class, false); - String serializedAuthInfo = stepikApiClient.getJsonConverter().toJson(authInfo); + String serializedAuthInfo = stepikApiClient.getJsonConverter().toJson(tokenInfo); synchronized (StepikConnectorLogin.class) { PasswordSafe.getInstance().setPassword(attributes, serializedAuthInfo); setLastUser(userId); @@ -194,25 +181,6 @@ public static StepikApiClient getStepikApiClient() { return stepikApiClient; } - @NotNull - public static User testAuthentication(@Nullable String username, @Nullable String password) { - TokenInfo currentTokenInfo = stepikApiClient.getTokenInfo(); - - User testUser; - try { - authenticate(username, password); - logger.info("The test authentication is successfully"); - testUser = getCurrentUser(); - } catch (StepikClientException e) { - logger.info("The test authentication failed"); - throw e; - } finally { - stepikApiClient.setTokenInfo(currentTokenInfo); - } - - return testUser; - } - @NotNull public static User getCurrentUser() { try { @@ -226,33 +194,6 @@ public static User getCurrentUser() { } } - public static void authenticate(@Nullable String username, @Nullable String password) { - try { - stepikApiClient.oauth2() - .userAuthenticationPassword(CLIENT_ID, username, password) - .execute(); - - AuthInfo authInfo = new AuthInfo(); - authInfo.setTokenInfo(stepikApiClient.getTokenInfo()); - authInfo.setUsername(username); - authInfo.setPassword(password); - - long userId = getCurrentUser().getId(); - setAuthInfo(userId, authInfo); - logger.info("Authentication is successfully"); - Metrics.authenticate(SUCCESSFUL); - } catch (StepikClientException e) { - logger.warn("Authentication failed", e); - throw e; - } - } - - @NotNull - public static String getCurrentUsername() { - User currentUser = getCurrentUser(); - return getAuthInfo(currentUser.getId()).getUsername(); - } - @NotNull public static String getCurrentUserFullName() { User user = getCurrentUser(); @@ -264,14 +205,12 @@ public static StepikApiClient authAndGetStepikApiClient() { return stepikApiClient; } - public static void logout() { - synchronized (StepikConnectorLogin.class) { - stepikApiClient.setTokenInfo(null); - long userId = getLastUser(); - setAuthInfo(userId, new AuthInfo()); - setLastUser(0); - logger.info("Logout successfully"); - } + public static synchronized void logout() { + stepikApiClient.setTokenInfo(null); + long userId = getLastUser(); + setAuthInfo(userId, new TokenInfo()); + setLastUser(0); + logger.info("Logout successfully"); } @Nullable diff --git a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form index f7165b95..33c894c4 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form +++ b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form @@ -1,9 +1,9 @@
    - + - + @@ -11,23 +11,6 @@ - - - - - - - - - - - - - - - - - @@ -35,47 +18,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -83,34 +31,41 @@ - + - + + + + + + - - + - + - + - + - + - + - + - + + + + diff --git a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java index bcd3941c..49a79deb 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java +++ b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java @@ -1,202 +1,67 @@ package org.stepik.plugin.collective.ui; -import com.intellij.ide.BrowserUtil; -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.ThrowableComputable; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.ui.DocumentAdapter; -import com.intellij.ui.HyperlinkAdapter; import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.stepik.EduStepikNames; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; -import org.intellij.lang.annotations.Language; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.stepik.api.exceptions.StepikClientException; -import org.stepik.api.exceptions.StepikUnauthorizedException; -import org.stepik.api.objects.users.User; import org.stepik.core.utils.Utils; import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.HyperlinkEvent; -import javax.swing.text.Document; -import javax.swing.text.PlainDocument; -import java.awt.*; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; - -import static com.intellij.openapi.ui.Messages.showMessageDialog; -import static com.intellij.openapi.ui.Messages.showWarningDialog; class StepikSettingsPanel { - private static final String DEFAULT_PASSWORD_TEXT = "************"; - private static final String TEST_CONNECTION = "Test connection"; - private static final String CHECK_CREDENTIALS = "Check credentials"; - private static final String WRONG_LOGIN_PASSWORD = "Wrong a login or a password"; - private static final String FAILED_CONNECTION = "Failed connection"; - private JTextField emailTextField; - private JPasswordField passwordField; - private JTextPane signupTextField; private JPanel pane; - private JButton testButton; private JCheckBox hintCheckBox; private JButton logoutButton; + private JLabel userName; + private JButton loginButton; - private boolean credentialsModified; private boolean hintCheckBoxModified; private StepikProjectManager projectManager; StepikSettingsPanel() { initProjectOfSettings(); - signupTextField.addHyperlinkListener(new HyperlinkAdapter() { - @Override - protected void hyperlinkActivated(final HyperlinkEvent e) { - BrowserUtil.browse(e.getURL()); - } - }); - @Language("HTML") - String signupText = "Do not have an account at stepik.org? Sign up"; - signupTextField.setText(String.format(signupText, EduStepikNames.STEPIK_SIGN_IN_LINK)); - signupTextField.setBackground(pane.getBackground()); - signupTextField.setCursor(new Cursor(Cursor.HAND_CURSOR)); hintCheckBox.setSelected(projectManager != null && projectManager.getShowHint()); hintCheckBox.addActionListener(e -> hintCheckBoxModified = true); - testButton.addActionListener(event -> { - try { - String login = getEmail(); - String password = getPassword(); - - User user = ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - return StepikConnectorLogin.testAuthentication(login, password); - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - String fullName = user.getFirstName() + " " + user.getLastName(); - String message = "Hello, " + fullName + "!\n I am glad to see you."; - showMessageDialog(message, TEST_CONNECTION, Messages.getInformationIcon()); - } catch (StepikUnauthorizedException e) { - showWarningDialog(WRONG_LOGIN_PASSWORD, TEST_CONNECTION); - } catch (StepikClientException e) { - showWarningDialog(FAILED_CONNECTION, TEST_CONNECTION); - } - }); - - emailTextField.getDocument().addDocumentListener(new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - if (!credentialsModified) { - erasePassword(); - } - } - }); - - passwordField.addFocusListener(new FocusAdapter() { - @Override - public void focusGained(FocusEvent e) { - if (!credentialsModified && !getPassword().isEmpty()) { - erasePassword(); - } - } - }); - - passwordField.getDocument().addDocumentListener(new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - credentialsModified = true; - } - }); logoutButton.addActionListener(e -> { - reset(); StepikConnectorLogin.logout(); + updateUserName(); + }); + + loginButton.addActionListener(e -> { + StepikConnectorLogin.authentication(); + updateUserName(); }); } - private void erasePassword() { - setPasswordFieldText(""); - credentialsModified = true; + private void updateUserName() { + userName.setText(StepikConnectorLogin.getCurrentUserFullName()); } JComponent getPanel() { return pane; } - @NotNull - private String getEmail() { - return emailTextField.getText().trim(); - } - - private void setLogin(@Nullable final String login) { - emailTextField.setText(login); - } - - @NotNull - private String getPassword() { - if (!credentialsModified) { - initProjectOfSettings(); - return StepikConnectorLogin.getCurrentUserPassword(); - } - return String.valueOf(passwordField.getPassword()); - } - - private void setPasswordFieldText(@NotNull final String password) { - // Show password as blank if password is empty - passwordField.setText(StringUtil.isEmpty(password) ? "" : password); - } - private void initProjectOfSettings() { projectManager = StepikProjectManager.getInstance(Utils.getCurrentProject()); } void reset() { initProjectOfSettings(); - setLogin(StepikConnectorLogin.getCurrentUsername()); - setPasswordFieldText(DEFAULT_PASSWORD_TEXT); - resetCredentialsModification(); + resetModification(); + updateUserName(); } void apply() { - if (credentialsModified) { - initProjectOfSettings(); - - try { - String login = getEmail(); - String password = getPassword(); - - ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - StepikConnectorLogin.authenticate(login, password); - return null; - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - } catch (StepikUnauthorizedException e) { - showWarningDialog(WRONG_LOGIN_PASSWORD, CHECK_CREDENTIALS); - } catch (StepikClientException e) { - showWarningDialog(FAILED_CONNECTION, CHECK_CREDENTIALS); - } - } - if (hintCheckBoxModified && projectManager != null) { projectManager.setShowHint(hintCheckBox.isSelected()); } - resetCredentialsModification(); + resetModification(); } boolean isModified() { - return credentialsModified || hintCheckBoxModified; + return hintCheckBoxModified; } - private void resetCredentialsModification() { - credentialsModified = false; + private void resetModification() { hintCheckBoxModified = false; } - - private void createUIComponents() { - Document doc = new PlainDocument(); - passwordField = new JPasswordField(doc, null, 0); - } } From 1d432f00cdd6cbaa8a9bdff2146af569f29cc538 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 17:15:29 +0700 Subject: [PATCH 07/55] A "implicit grant" url is constant --- .../learning/stepik/StepikConnectorLogin.java | 16 ++++------------ .../org/stepik/plugin/auth/ui/AuthDialog.java | 2 +- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index 334b72b8..fb66ad74 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -18,25 +18,21 @@ import org.stepik.core.metrics.Metrics; import org.stepik.plugin.auth.ui.AuthDialog; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.util.Map; -import static java.nio.charset.StandardCharsets.UTF_8; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; public class StepikConnectorLogin { private static final Logger logger = Logger.getInstance(StepikConnectorLogin.class); private static final String CLIENT_ID = "vV8giW7KTPMOTriOUBwyGLvXbKV0Cc4GPBnyCJPd"; - private static final String REDIRECT_URI = "https://stepik.org"; + private static final String REDIRECT_URI = "https%3A%2F%2Fstepik.org"; private static final String LAST_USER_PROPERTY_NAME = PLUGIN_ID + ".LAST_USER"; private static final StepikApiClient stepikApiClient = initStepikApiClient(); - private static final String IMPLICIT_GRANT_URL_TEMPLATE = "https://stepik.org/oauth2/authorize/" + + private static final String IMPLICIT_GRANT_URL = "https://stepik.org/oauth2/authorize/" + "?client_id=" + CLIENT_ID + - "&redirect_uri=%s" + + "&redirect_uri=" + REDIRECT_URI + "&scope=write" + - "&state=%s" + "&response_type=token"; private static long getLastUser() { @@ -215,11 +211,7 @@ public static synchronized void logout() { @Nullable public static String getImplicitGrantUrl() { - try { - return String.format(IMPLICIT_GRANT_URL_TEMPLATE, URLEncoder.encode(REDIRECT_URI, UTF_8.name()), "1234"); - } catch (UnsupportedEncodingException e) { - return null; - } + return IMPLICIT_GRANT_URL; } public static void logoutAndAuth() { diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 8426bdce..4b1e5ec2 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -159,7 +159,7 @@ public void changed( Arrays.stream(params).forEach(param -> { String[] entry = param.split("="); String value = ""; - if (entry.length > 0) { + if (entry.length > 1) { value = entry[1]; } map.put(entry[0], value); From 7b4cfe3b625aa6cf316ff4706ee8171b54f1d8d4 Mon Sep 17 00:00:00 2001 From: meanmail Date: Tue, 14 Mar 2017 16:47:17 +0700 Subject: [PATCH 08/55] Implemented a number quiz --- .../jetbrains/tmp/learning/StudyUtils.java | 7 +++ .../tmp/learning/courseFormat/StepNode.java | 6 +++ .../tmp/learning/courseFormat/StepType.java | 2 +- .../stepHelpers/NumberStepNodeHelper.java | 43 +++++++++++++++++++ .../tmp/learning/ui/FormListener.java | 4 ++ .../tmp/learning/ui/StudyToolWindow.java | 4 ++ .../main/resources/templates/quiz/number.ftl | 18 ++++++++ .../StepikSubmissionsPostQuery.java | 6 +++ 8 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java create mode 100644 core/src/main/resources/templates/quiz/number.ftl diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java index 15e3a8f0..ee89ce7e 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java @@ -18,6 +18,7 @@ import com.jetbrains.tmp.learning.courseFormat.StudyNode; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.ChoiceStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.MatchingStepNodeHelper; +import com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.SortingStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StringStepNodeHelper; @@ -134,6 +135,12 @@ public static String getMatchingStepText(@NotNull StepNode stepNode) { return processTemplate(stepNodeHelper, "quiz/matching"); } + @NotNull + public static String getNumberStepText(@NotNull StepNode stepNode) { + NumberStepNodeHelper stepNodeHelper = stepNode.asNumberStep(); + return processTemplate(stepNodeHelper, "quiz/number"); + } + @NotNull private static String processTemplate(@NotNull StepHelper stepNodeHelper, @NotNull String templateName) { String text = getTextStepText(stepNodeHelper.getStepNode()); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java index 34c382be..0b118597 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java @@ -6,6 +6,7 @@ import com.jetbrains.tmp.learning.core.EduNames; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.ChoiceStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.MatchingStepNodeHelper; +import com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.SortingStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StringStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.VideoStepNodeHelper; @@ -318,6 +319,11 @@ public MatchingStepNodeHelper asMatchingStep() { return new MatchingStepNodeHelper(this); } + @NotNull + public NumberStepNodeHelper asNumberStep() { + return new NumberStepNodeHelper(this); + } + public Long getAssignment() { if (assignment == null) { StudyNode parent = getParent(); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java index 29c1077a..9ae5629f 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java @@ -6,7 +6,7 @@ * @author meanmail */ public enum StepType { - UNKNOWN, CODE, TEXT, VIDEO, CHOICE, STRING, SORTING, MATCHING; + UNKNOWN, CODE, TEXT, VIDEO, CHOICE, STRING, SORTING, MATCHING, NUMBER; @NotNull public static StepType of(String name) { diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java new file mode 100644 index 00000000..3c1743e5 --- /dev/null +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java @@ -0,0 +1,43 @@ +package com.jetbrains.tmp.learning.courseFormat.stepHelpers; + +import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.apache.commons.lang.StringEscapeUtils; +import org.jetbrains.annotations.NotNull; + +/** + * @author meanmail + */ +public class NumberStepNodeHelper extends StepHelper { + private String number; + + public NumberStepNodeHelper(@NotNull StepNode stepNode) { + super(stepNode); + } + + @NotNull + public String getNumber() { + initStepOptions(); + return StringEscapeUtils.escapeHtml(number != null ? number : ""); + } + + @Override + protected boolean needInit() { + return number == null; + } + + @Override + protected void onStartInit() { + number = ""; + } + + @Override + protected void onSubmissionLoaded() { + number = reply.getNumber(); + number = number != null ? number : ""; + } + + @Override + protected void onInitFailed() { + number = null; + } +} diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java index 5e3a9ddd..6d3b05a0 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java @@ -128,6 +128,10 @@ public void run(@NotNull ProgressIndicator indicator) { String text = getStringData(elements); query.text(text); break; + case NUMBER: + String number = getStringData(elements); + query.number(number); + break; case SORTING: case MATCHING: List ordering = getOrderingData(elements); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java index c58975ed..44ef6fc0 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java @@ -43,6 +43,7 @@ import static com.jetbrains.tmp.learning.StudyUtils.getChoiceStepText; import static com.jetbrains.tmp.learning.StudyUtils.getCodeStepText; import static com.jetbrains.tmp.learning.StudyUtils.getMatchingStepText; +import static com.jetbrains.tmp.learning.StudyUtils.getNumberStepText; import static com.jetbrains.tmp.learning.StudyUtils.getSortingStepText; import static com.jetbrains.tmp.learning.StudyUtils.getStringStepText; import static com.jetbrains.tmp.learning.StudyUtils.getTextStepText; @@ -238,6 +239,9 @@ private void setText() { case MATCHING: text = getMatchingStepText(stepNode); break; + case NUMBER: + text = getNumberStepText(stepNode); + break; default: text = EMPTY_STEP_TEXT; break; diff --git a/core/src/main/resources/templates/quiz/number.ftl b/core/src/main/resources/templates/quiz/number.ftl new file mode 100644 index 00000000..a59c637b --- /dev/null +++ b/core/src/main/resources/templates/quiz/number.ftl @@ -0,0 +1,18 @@ +<#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper" --> +<#-- @ftlvariable name="text" type="java.lang.String" --> + + + +<#include "base.ftl"> + +<@quiz_content> + + + \ No newline at end of file diff --git a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java index 3865763f..38bad400 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java +++ b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java @@ -38,6 +38,12 @@ public StepikSubmissionsPostQuery text(@Nullable String text) { return this; } + @NotNull + public StepikSubmissionsPostQuery number(@Nullable String number) { + submissions.getSubmission().getReply().setNumber(number); + return this; + } + @NotNull public StepikSubmissionsPostQuery choices(List choices) { submissions.getSubmission().getReply().setChoices(choices); From 37dd06dc05302ec755565ccab41dff035c4c0396 Mon Sep 17 00:00:00 2001 From: meanmail Date: Tue, 14 Mar 2017 21:49:40 +0700 Subject: [PATCH 09/55] Minimal implemented dataset quiz --- .../jetbrains/tmp/learning/StudyUtils.java | 7 +++ .../tmp/learning/courseFormat/StepNode.java | 6 +++ .../tmp/learning/courseFormat/StepType.java | 2 +- .../stepHelpers/DatasetStepNodeHelper.java | 43 ++++++++++++++++++ .../courseFormat/stepHelpers/StepHelper.java | 26 ++++++++++- .../tmp/learning/ui/FormListener.java | 19 ++++++++ .../tmp/learning/ui/StudyToolWindow.java | 4 ++ .../main/resources/templates/quiz/dataset.ftl | 45 +++++++++++++++++++ .../stepik/api/objects/attempts/Attempt.java | 5 ++- .../stepik/api/objects/submissions/Reply.java | 10 +++++ .../api/objects/submissions/Submission.java | 5 ++- .../StepikSubmissionsPostQuery.java | 6 +++ 12 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java create mode 100644 core/src/main/resources/templates/quiz/dataset.ftl diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java index ee89ce7e..c1b666ac 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java @@ -17,6 +17,7 @@ import com.jetbrains.tmp.learning.courseFormat.StepNode; import com.jetbrains.tmp.learning.courseFormat.StudyNode; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.ChoiceStepNodeHelper; +import com.jetbrains.tmp.learning.courseFormat.stepHelpers.DatasetStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.MatchingStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.SortingStepNodeHelper; @@ -141,6 +142,12 @@ public static String getNumberStepText(@NotNull StepNode stepNode) { return processTemplate(stepNodeHelper, "quiz/number"); } + @NotNull + public static String getDatasetStepText(@NotNull StepNode stepNode) { + DatasetStepNodeHelper stepNodeHelper = stepNode.asDatasetStep(); + return processTemplate(stepNodeHelper, "quiz/dataset"); + } + @NotNull private static String processTemplate(@NotNull StepHelper stepNodeHelper, @NotNull String templateName) { String text = getTextStepText(stepNodeHelper.getStepNode()); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java index 0b118597..7abf489f 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java @@ -5,6 +5,7 @@ import com.jetbrains.tmp.learning.SupportedLanguages; import com.jetbrains.tmp.learning.core.EduNames; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.ChoiceStepNodeHelper; +import com.jetbrains.tmp.learning.courseFormat.stepHelpers.DatasetStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.MatchingStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.SortingStepNodeHelper; @@ -324,6 +325,11 @@ public NumberStepNodeHelper asNumberStep() { return new NumberStepNodeHelper(this); } + @NotNull + public DatasetStepNodeHelper asDatasetStep() { + return new DatasetStepNodeHelper(this); + } + public Long getAssignment() { if (assignment == null) { StudyNode parent = getParent(); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java index 9ae5629f..cdc50def 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java @@ -6,7 +6,7 @@ * @author meanmail */ public enum StepType { - UNKNOWN, CODE, TEXT, VIDEO, CHOICE, STRING, SORTING, MATCHING, NUMBER; + UNKNOWN, CODE, TEXT, VIDEO, CHOICE, STRING, SORTING, MATCHING, NUMBER, DATASET; @NotNull public static StepType of(String name) { diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java new file mode 100644 index 00000000..793a8503 --- /dev/null +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java @@ -0,0 +1,43 @@ +package com.jetbrains.tmp.learning.courseFormat.stepHelpers; + +import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.apache.commons.lang.StringEscapeUtils; +import org.jetbrains.annotations.NotNull; + +/** + * @author meanmail + */ +public class DatasetStepNodeHelper extends StepHelper { + private String data; + + public DatasetStepNodeHelper(@NotNull StepNode stepNode) { + super(stepNode); + } + + @NotNull + public String getData() { + initStepOptions(); + return StringEscapeUtils.escapeHtml(data != null ? data : ""); + } + + @Override + protected boolean needInit() { + return data == null; + } + + @Override + protected void onStartInit() { + data = ""; + } + + @Override + protected void onSubmissionLoaded() { + data = reply.getText(); + data = data != null ? data : ""; + } + + @Override + protected void onInitFailed() { + data = null; + } +} diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java index cbe338f2..deb0de46 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java @@ -15,6 +15,7 @@ import org.stepik.api.objects.submissions.Submissions; import org.stepik.api.objects.users.User; import org.stepik.api.queries.Order; +import org.stepik.api.urls.Urls; /** * @author meanmail @@ -29,6 +30,7 @@ public class StepHelper { @NotNull private Attempt attempt = new Attempt(); private int submissionsCount = -1; + private Submission submission; StepHelper(@NotNull StepNode stepNode) { this.stepNode = stepNode; @@ -64,7 +66,7 @@ private boolean loadSubmission(StepikApiClient stepikApiClient, long userId) { .execute(); if (!submissions.isEmpty()) { - Submission submission = submissions.getSubmissions().get(0); + submission = submissions.getSubmissions().get(0); reply = submission.getReply(); status = submission.getStatus(); stepNode.setStatus(StudyStatus.of(status)); @@ -93,9 +95,31 @@ public long getAttemptId() { @NotNull Dataset getDataset() { + initStepOptions(); return attempt.getDataset(); } + @NotNull + public String getDatasetUrl() { + initStepOptions(); + return attempt.getDatasetUrl(); + } + + public int getTimeLeft() { + initStepOptions(); + return attempt.getTimeLeft(); + } + + @NotNull + public String getReplyUrl() { + initStepOptions(); + return submission != null ? submission.getReplyUrl() : ""; + } + + public String getBaseUrl() { + return Urls.STEPIK_URL; + } + void initStepOptions() { if (!needInit()) { return; diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java index 6d3b05a0..c3ee057f 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java @@ -18,11 +18,13 @@ import org.stepik.api.objects.submissions.Submissions; import org.stepik.api.queries.submissions.StepikSubmissionsPostQuery; import org.stepik.plugin.actions.SendAction; +import org.w3c.dom.Node; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.html.HTMLCollection; import org.w3c.dom.html.HTMLFormElement; import org.w3c.dom.html.HTMLInputElement; +import org.w3c.dom.html.HTMLTextAreaElement; import java.util.ArrayList; import java.util.Collections; @@ -132,6 +134,10 @@ public void run(@NotNull ProgressIndicator indicator) { String number = getStringData(elements); query.number(number); break; + case DATASET: + String dataset = getDataset(elements); + query.file(dataset); + break; case SORTING: case MATCHING: List ordering = getOrderingData(elements); @@ -210,4 +216,17 @@ private String getStringData(@NotNull HTMLCollection elements) { } return ((HTMLInputElement) elements.namedItem("text")).getValue(); } + + private String getDataset(@NotNull HTMLCollection elements) { + for (int i = 0; i < elements.getLength(); i++) { + Node item = elements.item(i); + if (item instanceof HTMLInputElement) { + HTMLInputElement element = ((HTMLInputElement) elements.item(i)); + if (!"hidden".equals(element.getType())) { + element.setDisabled(true); + } + } + } + return ((HTMLTextAreaElement) elements.namedItem("text")).getValue(); + } } \ No newline at end of file diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java index 44ef6fc0..4c5edc0a 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java @@ -42,6 +42,7 @@ import static com.jetbrains.tmp.learning.StudyUtils.getChoiceStepText; import static com.jetbrains.tmp.learning.StudyUtils.getCodeStepText; +import static com.jetbrains.tmp.learning.StudyUtils.getDatasetStepText; import static com.jetbrains.tmp.learning.StudyUtils.getMatchingStepText; import static com.jetbrains.tmp.learning.StudyUtils.getNumberStepText; import static com.jetbrains.tmp.learning.StudyUtils.getSortingStepText; @@ -242,6 +243,9 @@ private void setText() { case NUMBER: text = getNumberStepText(stepNode); break; + case DATASET: + text = getDatasetStepText(stepNode); + break; default: text = EMPTY_STEP_TEXT; break; diff --git a/core/src/main/resources/templates/quiz/dataset.ftl b/core/src/main/resources/templates/quiz/dataset.ftl new file mode 100644 index 00000000..49d2e3a0 --- /dev/null +++ b/core/src/main/resources/templates/quiz/dataset.ftl @@ -0,0 +1,45 @@ +<#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.DatasetStepNodeHelper" --> +<#-- @ftlvariable name="text" type="java.lang.String" --> + + + + + +<#include "base.ftl"> + +<@quiz_content> +
    5 minutes
    + <#assign dataset_url = stepNode.getDatasetUrl()/> + <#assign reply_url = stepNode.getReplyUrl()/> + + <#if dataset_url != ""> + Download dataset + + + <#if reply_url != "" > + Download last submission dataset + + + + \ No newline at end of file diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Attempt.java b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Attempt.java index 1f9301fb..89963885 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Attempt.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Attempt.java @@ -31,8 +31,11 @@ public void setDataset(@Nullable Dataset dataset) { this.dataset = dataset; } - @Nullable + @NotNull public String getDatasetUrl() { + if (datasetUrl == null) { + datasetUrl = ""; + } return datasetUrl; } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java index 01d848e6..d504da6e 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java @@ -19,6 +19,7 @@ public class Reply { private List choices; private List ordering; private String number; + private String file; @NotNull public String getLanguage() { @@ -118,4 +119,13 @@ public String getNumber() { public void setNumber(@Nullable String number) { this.number = number; } + + @Nullable + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Submission.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Submission.java index c8e02240..460e925b 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Submission.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Submission.java @@ -83,8 +83,11 @@ public void setFeedback(@Nullable String feedback) { this.feedback = feedback; } - @Nullable + @NotNull public String getReplyUrl() { + if (replyUrl == null) { + replyUrl = ""; + } return replyUrl; } diff --git a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java index 38bad400..f7d4607a 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java +++ b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java @@ -44,6 +44,12 @@ public StepikSubmissionsPostQuery number(@Nullable String number) { return this; } + @NotNull + public StepikSubmissionsPostQuery file(@Nullable String file) { + submissions.getSubmission().getReply().setFile(file); + return this; + } + @NotNull public StepikSubmissionsPostQuery choices(List choices) { submissions.getSubmission().getReply().setChoices(choices); From 9b37b7d6ab48c5519f72d1e7cb79d2d1bb8efe2c Mon Sep 17 00:00:00 2001 From: meanmail Date: Wed, 15 Mar 2017 00:11:27 +0700 Subject: [PATCH 10/55] Added timer (dataset quiz) --- .../tmp/learning/ui/FormListener.java | 1 + .../main/resources/templates/quiz/base.ftl | 44 ++++++++---- .../main/resources/templates/quiz/dataset.ftl | 72 ++++++++++++++----- 3 files changed, 85 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java index c3ee057f..d3e2a24f 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java @@ -76,6 +76,7 @@ public void handleEvent(Event event) { case "": case "correct": case "wrong": + case "timeleft": if (!locked) { getAttempt(stepNode); StudyUtils.setStudyNode(project, node, true); diff --git a/core/src/main/resources/templates/quiz/base.ftl b/core/src/main/resources/templates/quiz/base.ftl index b2d3eb5e..4d8ebb63 100644 --- a/core/src/main/resources/templates/quiz/base.ftl +++ b/core/src/main/resources/templates/quiz/base.ftl @@ -23,28 +23,46 @@ ${text}
    <#nested/> - +
    <#if !locked> - <#if status == ""> - <#assign submitCaption = "Solve" /> - <#elseif status == "active"> - <#assign submitCaption = "Submit" /> - <#elseif status != "evaluation"> - <#assign submitCaption = "Solve again" /> - <#else> - <#assign submitCaption = "Evaluation" /> - <#assign disabledSubmit = "disabled" /> - - - + + + <#if isHasSubmissionsRestrictions>

    ${maxSubmissionsCount - submissionsCount} attempts left

    diff --git a/core/src/main/resources/templates/quiz/dataset.ftl b/core/src/main/resources/templates/quiz/dataset.ftl index 49d2e3a0..7980db90 100644 --- a/core/src/main/resources/templates/quiz/dataset.ftl +++ b/core/src/main/resources/templates/quiz/dataset.ftl @@ -6,25 +6,22 @@ display: block; margin: 10px auto; width: 100%; + min-height: 200px; } - - + .dataset-url:hover { + background-color: darkkhaki; + } + <#include "base.ftl"> @@ -34,12 +31,49 @@ <#assign reply_url = stepNode.getReplyUrl()/> <#if dataset_url != ""> - Download dataset + Download dataset <#if reply_url != "" > - Download last submission dataset + Download last submission dataset - \ No newline at end of file + + + \ No newline at end of file From 379581a82e19e7f2d9527eb4fe0942c07663f774 Mon Sep 17 00:00:00 2001 From: meanmail Date: Wed, 15 Mar 2017 17:36:58 +0700 Subject: [PATCH 11/55] Loading datasets and replies to a src directory (dataset quiz) --- .../tmp/learning/ui/StudyBrowserWindow.java | 63 ++++++++++++++++++- .../main/resources/templates/quiz/dataset.ftl | 7 ++- .../stepik/api/actions/StepikFilesAction.java | 62 ++++++++++++++++++ .../org/stepik/api/client/ClientResponse.java | 5 ++ .../stepik/api/client/StepikApiClient.java | 6 ++ 5 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 stepik-java-api/src/main/java/org/stepik/api/actions/StepikFilesAction.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java index 5799e52c..4edb6a2f 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java @@ -5,16 +5,22 @@ import com.intellij.ide.ui.LafManager; import com.intellij.ide.ui.LafManagerListener; import com.intellij.ide.ui.laf.darcula.DarculaLookAndFeelInfo; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.tmp.learning.StepikProjectManager; +import com.jetbrains.tmp.learning.StudyUtils; import com.jetbrains.tmp.learning.courseFormat.CourseNode; import com.jetbrains.tmp.learning.courseFormat.LessonNode; import com.jetbrains.tmp.learning.courseFormat.SectionNode; import com.jetbrains.tmp.learning.courseFormat.StepNode; import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import javafx.application.Platform; import javafx.concurrent.Worker; import javafx.embed.swing.JFXPanel; @@ -26,6 +32,8 @@ import javafx.scene.web.WebView; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.stepik.api.client.StepikApiClient; +import org.stepik.api.exceptions.StepikClientException; import org.stepik.api.urls.Urls; import org.stepik.core.templates.Templater; import org.stepik.plugin.utils.NavigationUtils; @@ -42,12 +50,16 @@ import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; + class StudyBrowserWindow extends JFrame { + private static final Logger logger = Logger.getInstance(StudyBrowserWindow.class); private static final String EVENT_TYPE_CLICK = "click"; private final Project project; private JFXPanel panel; @@ -198,11 +210,60 @@ public void handleEvent(Event ev) { engine.setJavaScriptEnabled(true); engine.getLoadWorker().cancel(); ev.preventDefault(); - String href = getLink((Element) ev.getTarget()); + Element target = (Element) ev.getTarget(); + String href = getLink(target); if (href == null) { return; } + if (href.startsWith("inner:")) { + href = href.substring(6); + StudyNode root = StepikProjectManager.getProjectRoot(project); + if (root == null) { + return; + } + + String stepPath = target.getAttribute("data-step-path"); + + StudyNode node = StudyUtils.getStudyNode(root, stepPath); + if (node == null || !(node instanceof StepNode)) { + return; + } + + String contentType = target.getAttribute("data-content-type"); + String prefix = target.getAttribute("data-file-prefix"); + String extension = target.getAttribute("data-file-ext"); + + try { + StepikApiClient stepikApiClient = StepikConnectorLogin.getStepikApiClient(); + String content = stepikApiClient.files().get(href, contentType); + VirtualFile srcDirectory = getOrCreateSrcDirectory(project, (StepNode) node, true); + if (srcDirectory == null) { + return; + } + Application application = ApplicationManager.getApplication(); + application.invokeLater(() -> application.runWriteAction(() -> { + try { + int index = 1; + String filename = prefix + "_" + node.getId(); + String currentFileName = filename + extension; + while (srcDirectory.findChild(currentFileName) != null) { + currentFileName = filename + "_" + index++ + extension; + } + VirtualFile file = srcDirectory.createChildData(null, currentFileName); + file.setBinaryContent(content.getBytes()); + FileEditorManager.getInstance(project).openFile(file, false); + } catch (IOException e) { + logger.warn(e); + } + })); + } catch (StepikClientException e) { + logger.warn(e); + } + + return; + } + if (browseProject(href)) { return; } diff --git a/core/src/main/resources/templates/quiz/dataset.ftl b/core/src/main/resources/templates/quiz/dataset.ftl index 7980db90..35f63007 100644 --- a/core/src/main/resources/templates/quiz/dataset.ftl +++ b/core/src/main/resources/templates/quiz/dataset.ftl @@ -31,11 +31,14 @@ <#assign reply_url = stepNode.getReplyUrl()/> <#if dataset_url != ""> - Download dataset + Download dataset <#if reply_url != "" > - Download last submission dataset + Download last submission + dataset diff --git a/stepik-java-api/src/main/java/org/stepik/api/actions/StepikFilesAction.java b/stepik-java-api/src/main/java/org/stepik/api/actions/StepikFilesAction.java new file mode 100644 index 00000000..afdbe60b --- /dev/null +++ b/stepik-java-api/src/main/java/org/stepik/api/actions/StepikFilesAction.java @@ -0,0 +1,62 @@ +package org.stepik.api.actions; + +import org.apache.http.HttpHeaders; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.stepik.api.client.ClientResponse; +import org.stepik.api.client.StatusCodes; +import org.stepik.api.client.StepikApiClient; +import org.stepik.api.client.TransportClient; +import org.stepik.api.exceptions.StepikClientException; +import org.stepik.api.exceptions.StepikUnauthorizedException; +import org.stepik.api.objects.auth.TokenInfo; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author meanmail + */ +public class StepikFilesAction extends StepikAbstractAction { + private static final Logger logger = LoggerFactory.getLogger(StepikFilesAction.class); + + public StepikFilesAction(@NotNull StepikApiClient stepikApiClient) { + super(stepikApiClient); + } + + @NotNull + public String get(@NotNull String url, String contentType) { + StepikApiClient stepikApi = getStepikApiClient(); + TransportClient transportClient = stepikApi.getTransportClient(); + + Map headers = new HashMap<>(); + TokenInfo tokenInfo = stepikApi.getTokenInfo(); + String accessToken = tokenInfo.getAccessToken(); + if (accessToken != null) { + String tokenType = tokenInfo.getTokenType(); + headers.put(HttpHeaders.AUTHORIZATION, tokenType + " " + accessToken); + } + headers.put(HttpHeaders.CONTENT_TYPE, contentType); + + ClientResponse response = transportClient.get(stepikApi, url, headers); + + if (response.getStatusCode() / 100 != 2) { + String message = "Failed query to " + url + " returned the status code " + response.getStatusCode(); + logger.warn(message); + + if (response.getStatusCode() == StatusCodes.SC_UNAUTHORIZED) { + throw new StepikUnauthorizedException(message); + } else { + throw new StepikClientException(message); + } + } + + String result = response.getBody(); + + if (result == null) { + throw new StepikClientException("Request successfully but the response body is null: " + url); + } + return result; + } +} diff --git a/stepik-java-api/src/main/java/org/stepik/api/client/ClientResponse.java b/stepik-java-api/src/main/java/org/stepik/api/client/ClientResponse.java index 3c22e320..3638c2de 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/client/ClientResponse.java +++ b/stepik-java-api/src/main/java/org/stepik/api/client/ClientResponse.java @@ -39,6 +39,11 @@ public T getBody(@NotNull Class clazz) { return stepikApiClient.getJsonConverter().fromJson(body, clazz); } + @Nullable + public String getBody() { + return body; + } + @NotNull public Map getHeaders() { return headers; diff --git a/stepik-java-api/src/main/java/org/stepik/api/client/StepikApiClient.java b/stepik-java-api/src/main/java/org/stepik/api/client/StepikApiClient.java index f3fe5c18..1d029715 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/client/StepikApiClient.java +++ b/stepik-java-api/src/main/java/org/stepik/api/client/StepikApiClient.java @@ -29,6 +29,7 @@ import org.stepik.api.actions.StepikEventsAction; import org.stepik.api.actions.StepikExamSessionsAction; import org.stepik.api.actions.StepikFavoriteCoursesAction; +import org.stepik.api.actions.StepikFilesAction; import org.stepik.api.actions.StepikGroupsAction; import org.stepik.api.actions.StepikInstructionsAction; import org.stepik.api.actions.StepikInvitesAction; @@ -257,6 +258,11 @@ public StepikFavoriteCoursesAction favoriteCourses() { return new StepikFavoriteCoursesAction(this); } + @NotNull + public StepikFilesAction files() { + return new StepikFilesAction(this); + } + @NotNull public StepikGroupsAction groups() { return new StepikGroupsAction(this); From 16ea1e35e1cb07b8f78c09b210fdaaabe1f657d3 Mon Sep 17 00:00:00 2001 From: meanmail Date: Wed, 15 Mar 2017 23:40:09 +0700 Subject: [PATCH 12/55] Sending dataset from file (dataset quiz) --- .../tmp/learning/ui/FormListener.java | 57 +++++++++++++++++-- .../main/resources/templates/quiz/dataset.ftl | 20 +++++-- 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java index d3e2a24f..c5ab48f9 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java @@ -5,13 +5,16 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.tmp.learning.StepikProjectManager; import com.jetbrains.tmp.learning.StudyUtils; import com.jetbrains.tmp.learning.courseFormat.StepNode; import com.jetbrains.tmp.learning.courseFormat.StepType; import com.jetbrains.tmp.learning.courseFormat.StudyNode; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import javafx.stage.FileChooser; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; import org.stepik.api.exceptions.StepikClientException; import org.stepik.api.objects.submissions.Submission; @@ -26,10 +29,16 @@ import org.w3c.dom.html.HTMLInputElement; import org.w3c.dom.html.HTMLTextAreaElement; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; + class FormListener implements EventListener { static final String EVENT_TYPE_SUBMIT = "submit"; private static final Logger logger = Logger.getInstance(FormListener.class); @@ -69,6 +78,36 @@ public void handleEvent(Event event) { boolean locked = Boolean.valueOf(((HTMLInputElement) elements .namedItem("locked")).getValue()); + HTMLInputElement isFromFileElement = ((HTMLInputElement) elements.namedItem("isFromFile")); + boolean isFromFile = isFromFileElement != null && isFromFileElement.getValue().equals("true"); + + String data = null; + if (isFromFile) { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Open file"); + VirtualFile srcDirectory = getOrCreateSrcDirectory(project, stepNode, true); + if (srcDirectory != null) { + File initialDir = new File(srcDirectory.getPath()); + fileChooser.setInitialDirectory(initialDir); + } + File file = fileChooser.showOpenDialog(null); + if (file != null) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + StringBuilder fileData = new StringBuilder(); + char[] buffer = new char[1024]; + int number; + while ((number = reader.read(buffer)) != -1) { + String readData = String.valueOf(buffer, 0, number); + fileData.append(readData); + } + reader.close(); + data = fileData.toString(); + } catch (IOException e) { + logger.warn(e); + } + } + } + StepType type = StepType.of(typeStr); try { @@ -76,14 +115,18 @@ public void handleEvent(Event event) { case "": case "correct": case "wrong": - case "timeleft": + case "timeLeft": if (!locked) { getAttempt(stepNode); StudyUtils.setStudyNode(project, node, true); } break; case "active": - sendStep(stepNode, elements, type, attemptId); + if (!isFromFile) { + sendStep(stepNode, elements, type, attemptId, null); + } else if (data != null) { + sendStep(stepNode, elements, type, attemptId, data); + } break; default: return; @@ -108,7 +151,8 @@ private void sendStep( @NotNull StepNode stepNode, @NotNull HTMLCollection elements, @NotNull StepType type, - long attemptId) { + long attemptId, + @Nullable String data) { String title = "Checking Step: " + stepNode.getName(); ProgressManager.getInstance().run(new Task.Backgroundable(project, title) { @@ -136,7 +180,12 @@ public void run(@NotNull ProgressIndicator indicator) { query.number(number); break; case DATASET: - String dataset = getDataset(elements); + String dataset; + if (data == null) { + dataset = getDataset(elements); + } else { + dataset = data; + } query.file(dataset); break; case SORTING: diff --git a/core/src/main/resources/templates/quiz/dataset.ftl b/core/src/main/resources/templates/quiz/dataset.ftl index 35f63007..8a872033 100644 --- a/core/src/main/resources/templates/quiz/dataset.ftl +++ b/core/src/main/resources/templates/quiz/dataset.ftl @@ -2,10 +2,13 @@ <#-- @ftlvariable name="text" type="java.lang.String" --> + +<#include "base.ftl"> + +<@quiz_content> + + + + + <#list stepNode.getColumns() as column> + + + + + <#assign type=stepNode.isCheckbox()?string("checkbox", "radio") /> + <#assign row_index = 0/> + <#list stepNode.getRows() as row> + + + + <#assign column_index = 0/> + <#list stepNode.getColumns() as column> + + <#assign column_index += 1 /> + + <#assign row_index += 1 /> + + +
    ${stepNode.getDescription()}${column}
    ${row} + +
    + \ No newline at end of file From b7b1a5178c48dfd87abb321908667e2c8a8b91d7 Mon Sep 17 00:00:00 2001 From: meanmail Date: Fri, 17 Mar 2017 19:16:01 +0700 Subject: [PATCH 16/55] Sending submission (table quiz) --- .../tmp/learning/ui/FormListener.java | 40 +++++++++++++++++++ .../objects/attempts/DatasetDeserializer.java | 26 ++++++------ .../api/objects/submissions/Choice.java | 19 ++++++++- .../api/objects/submissions/Column.java | 14 ++++++- .../stepik/api/objects/submissions/Reply.java | 25 +++++++----- .../submissions/ReplyDeserializer.java | 2 +- .../StepikSubmissionsPostQuery.java | 2 +- 7 files changed, 102 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java index 265b1cc6..c7e1b1e3 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java @@ -17,6 +17,8 @@ import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; import org.stepik.api.exceptions.StepikClientException; +import org.stepik.api.objects.submissions.Choice; +import org.stepik.api.objects.submissions.Column; import org.stepik.api.objects.submissions.Submission; import org.stepik.api.objects.submissions.Submissions; import org.stepik.api.queries.submissions.StepikSubmissionsPostQuery; @@ -34,7 +36,10 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; @@ -184,6 +189,10 @@ public void run(@NotNull ProgressIndicator indicator) { } query.file(dataset); break; + case TABLE: + List tableChoices = getChoices(elements); + query.choices(tableChoices); + break; case SORTING: case MATCHING: List ordering = getOrderingData(elements); @@ -275,4 +284,35 @@ private String getDataset(@NotNull HTMLCollection elements) { } return ((HTMLTextAreaElement) elements.namedItem("text")).getValue(); } + + @NotNull + private List getChoices(@NotNull HTMLCollection elements) { + Map> choices = new HashMap<>(); + List rows = new ArrayList<>(); + + for (int i = 0; i < elements.getLength(); i++) { + Node item = elements.item(i); + if (item instanceof HTMLInputElement) { + HTMLInputElement element = ((HTMLInputElement) elements.item(i)); + String type = element.getType(); + + if ("checkbox".equals(type) || "radio".equals(type)) { + List columns = choices.computeIfAbsent(element.getName(), k -> { + rows.add(k); + return new ArrayList<>(); + }); + Column column = new Column(element.getValue(), element.getChecked()); + columns.add(column); + } + if (!"hidden".equals(type)) { + element.setDisabled(true); + } + } + } + + return choices.entrySet().stream() + .map(entry -> new Choice(entry.getKey(), entry.getValue())) + .sorted(Comparator.comparingInt(choice -> rows.indexOf(choice.getNameRow()))) + .collect(Collectors.toList()); + } } \ No newline at end of file diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/DatasetDeserializer.java b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/DatasetDeserializer.java index 36cf8058..d22f6ad6 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/DatasetDeserializer.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/DatasetDeserializer.java @@ -19,6 +19,17 @@ */ public class DatasetDeserializer implements JsonDeserializer { + @NotNull + private static List getStringList(@NotNull JsonObject object, @NotNull String memberName) { + JsonArray jsonArray = object.getAsJsonArray(memberName); + if (jsonArray != null) { + List array = new ArrayList<>(); + jsonArray.forEach(element -> array.add(element.getAsString())); + return array; + } + return Collections.emptyList(); + } + @Override public Dataset deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { @@ -62,19 +73,10 @@ public Dataset deserialize(JsonElement json, Type typeOfT, JsonDeserializationCo } JsonPrimitive description = object.getAsJsonPrimitive("description"); - dataset.setDescription(description.getAsString()); + if (description != null) { + dataset.setDescription(description.getAsString()); + } return dataset; } - - @NotNull - private static List getStringList(@NotNull JsonObject object, @NotNull String memberName) { - JsonArray jsonArray = object.getAsJsonArray(memberName); - if (jsonArray != null) { - List array = new ArrayList<>(); - jsonArray.forEach(element -> array.add(element.getAsString())); - return array; - } - return Collections.emptyList(); - } } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Choice.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Choice.java index b94b71cb..8ebf44d8 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Choice.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Choice.java @@ -1,7 +1,10 @@ package org.stepik.api.objects.submissions; import com.google.gson.annotations.SerializedName; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; /** @@ -12,19 +15,31 @@ public class Choice { private String nameRow; private List columns; + public Choice(@Nullable String nameRow, @Nullable List columns) { + this.nameRow = nameRow; + this.columns = columns; + } + + @NotNull public String getNameRow() { + if (nameRow == null) { + nameRow = ""; + } return nameRow; } - public void setNameRow(String nameRow) { + public void setNameRow(@Nullable String nameRow) { this.nameRow = nameRow; } public List getColumns() { + if (columns == null) { + columns = new ArrayList<>(); + } return columns; } - public void setColumns(List columns) { + public void setColumns(@Nullable List columns) { this.columns = columns; } } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Column.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Column.java index dd72c751..fbcda425 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Column.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Column.java @@ -1,5 +1,8 @@ package org.stepik.api.objects.submissions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + /** * @author meanmail */ @@ -7,11 +10,20 @@ public class Column { private String name; private boolean answer; + public Column(@Nullable String name, boolean answer) { + this.name = name; + this.answer = answer; + } + + @NotNull public String getName() { + if (name == null) { + name = ""; + } return name; } - public void setName(String name) { + public void setName(@Nullable String name) { this.name = name; } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java index 135b2b88..a5e6f970 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -16,8 +17,7 @@ public class Reply { private List attachments; private String text; private List files; - private List choices; - private List tableChoices; + private List choices; private List ordering; private String number; private String file; @@ -93,10 +93,14 @@ public List getChoices() { if (choices == null) { choices = new ArrayList<>(); } + if (choices.size() > 1 && !(choices.get(0) instanceof Boolean)) { + return Collections.emptyList(); + } + //noinspection unchecked return choices; } - public void setChoices(@Nullable List choices) { + public void setChoices(@Nullable List choices) { this.choices = choices; } @@ -130,12 +134,15 @@ public void setFile(@Nullable String file) { this.file = file; } - @Nullable + @NotNull public List getTableChoices() { - return tableChoices; - } - - public void setTableChoices(@Nullable List tableChoices) { - this.tableChoices = tableChoices; + if (choices == null) { + choices = new ArrayList<>(); + } + if (choices.size() > 1 && !(choices.get(0) instanceof Choice)) { + return Collections.emptyList(); + } + //noinspection unchecked + return choices; } } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/ReplyDeserializer.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/ReplyDeserializer.java index 24064ebb..f7093c5e 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/ReplyDeserializer.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/ReplyDeserializer.java @@ -94,7 +94,7 @@ public Reply deserialize(JsonElement json, Type typeOfT, JsonDeserializationCont } else { List list = new ArrayList<>(); choices.forEach(item -> list.add(context.deserialize(item, Choice.class))); - reply.setTableChoices(list); + reply.setChoices(list); } } diff --git a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java index f7d4607a..0a133391 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java +++ b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java @@ -51,7 +51,7 @@ public StepikSubmissionsPostQuery file(@Nullable String file) { } @NotNull - public StepikSubmissionsPostQuery choices(List choices) { + public StepikSubmissionsPostQuery choices(@Nullable List choices) { submissions.getSubmission().getReply().setChoices(choices); return this; } From f80e59899348403e994efeae41fffadb23fd1bcc Mon Sep 17 00:00:00 2001 From: meanmail Date: Fri, 17 Mar 2017 19:23:38 +0700 Subject: [PATCH 17/55] Style (table quiz) --- core/src/main/resources/templates/quiz/table.ftl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/main/resources/templates/quiz/table.ftl b/core/src/main/resources/templates/quiz/table.ftl index 84d56570..56ed0302 100644 --- a/core/src/main/resources/templates/quiz/table.ftl +++ b/core/src/main/resources/templates/quiz/table.ftl @@ -15,6 +15,11 @@ .table td:first-child { text-align: left; } + + .table td, + .table th { + border-bottom: 1px solid darkgray; + } <#include "base.ftl"> From f7d7ce0524edbca284fbed1253a3dc32a910e662 Mon Sep 17 00:00:00 2001 From: meanmail Date: Fri, 17 Mar 2017 23:26:37 +0700 Subject: [PATCH 18/55] Shows step content with inputs, selectors, texts. Input element is autosizable(fill-blanks quiz) --- .../jetbrains/tmp/learning/StudyUtils.java | 10 ++- .../tmp/learning/courseFormat/StepNode.java | 5 ++ .../tmp/learning/courseFormat/StepType.java | 39 +++++++-- .../courseFormat/stepHelpers/StepHelper.java | 23 +++++- .../tmp/learning/ui/StudyToolWindow.java | 4 + .../java/org/stepik/core/metrics/Metrics.java | 2 +- .../resources/templates/quiz/fill-blanks.ftl | 80 +++++++++++++++++++ .../api/objects/attempts/Component.java | 57 +++++++++++++ .../stepik/api/objects/attempts/Dataset.java | 19 ++++- .../objects/attempts/DatasetDeserializer.java | 7 ++ .../stepik/api/objects/submissions/Reply.java | 13 +++ .../submissions/ReplyDeserializer.java | 2 + 12 files changed, 247 insertions(+), 14 deletions(-) create mode 100644 core/src/main/resources/templates/quiz/fill-blanks.ftl create mode 100644 stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Component.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java index 095e10dc..41dc8c08 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java @@ -155,6 +155,12 @@ public static String getTableStepText(@NotNull StepNode stepNode) { return processTemplate(stepNodeHelper, "quiz/table"); } + @NotNull + public static String getFillBlanksStepText(@NotNull StepNode stepNode) { + StepHelper stepNodeHelper = stepNode.asStepHelper(); + return processTemplate(stepNodeHelper, "quiz/fill-blanks"); + } + @NotNull private static String processTemplate(@NotNull StepHelper stepNodeHelper, @NotNull String templateName) { String text = getTextStepText(stepNodeHelper.getStepNode()); @@ -189,7 +195,7 @@ private static String getStepText(@NotNull StepNode stepNode, @NotNull String li @NotNull public static String getUnknownStepText(@NotNull StepNode stepNode) { Step data = stepNode.getData(); - String stepType = data != null ? data.getBlock().getName() : stepNode.getType().toString(); + String stepType = data != null ? data.getBlock().getName() : stepNode.getType().getName(); return getStepText(stepNode, UNKNOWN_STEP_TEXT, stepType); } @@ -269,7 +275,7 @@ public static StepNode getSelectedStep(@NotNull Project project) { } @Nullable - public static StudyNode getSelectedNode(@NotNull Project project) { + static StudyNode getSelectedNode(@NotNull Project project) { StudyNode studyNode = getSelectedStep(project); if (studyNode == null) { diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java index 0435f65c..3c7f9224 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java @@ -9,6 +9,7 @@ import com.jetbrains.tmp.learning.courseFormat.stepHelpers.MatchingStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.SortingStepNodeHelper; +import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StringStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.TableStepNodeHelper; import com.jetbrains.tmp.learning.courseFormat.stepHelpers.VideoStepNodeHelper; @@ -357,4 +358,8 @@ public Long getAssignment() { } return assignment; } + + public StepHelper asStepHelper() { + return new StepHelper(this); + } } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java index ceb19c9c..fd3631ca 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java @@ -2,23 +2,50 @@ import org.jetbrains.annotations.NotNull; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + /** * @author meanmail */ public enum StepType { - UNKNOWN, CODE, TEXT, VIDEO, CHOICE, STRING, SORTING, MATCHING, NUMBER, DATASET, TABLE; + UNKNOWN("unknown"), + CODE("code"), + TEXT("text"), + VIDEO("video"), + CHOICE("choice"), + STRING("string"), + SORTING("sorting"), + MATCHING("matching"), + NUMBER("number"), + DATASET("dataset"), + TABLE("table"), + FILL_BLANKS("fill-blanks"); + + private static Map map; + private final String name; + + StepType(String name) { + this.name = name; + } @NotNull public static StepType of(String name) { - try { - return valueOf(name.toUpperCase()); - } catch (IllegalArgumentException e) { - return UNKNOWN; + if (map == null) { + map = new HashMap<>(); + Arrays.stream(values()) + .forEach(value -> map.put(value.name, value)); } + return map.getOrDefault(name, UNKNOWN); } @Override public String toString() { - return name().toLowerCase(); + return name; + } + + public String getName() { + return name; } } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java index 2b20c97a..323bbb67 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java @@ -9,6 +9,7 @@ import org.stepik.api.exceptions.StepikClientException; import org.stepik.api.objects.attempts.Attempt; import org.stepik.api.objects.attempts.Attempts; +import org.stepik.api.objects.attempts.Component; import org.stepik.api.objects.attempts.Dataset; import org.stepik.api.objects.submissions.Reply; import org.stepik.api.objects.submissions.Submission; @@ -17,6 +18,8 @@ import org.stepik.api.queries.Order; import org.stepik.api.urls.Urls; +import java.util.List; + /** * @author meanmail */ @@ -31,8 +34,9 @@ public class StepHelper { private Attempt attempt = new Attempt(); private int submissionsCount = -1; private Submission submission; + private boolean inited; - StepHelper(@NotNull StepNode stepNode) { + public StepHelper(@NotNull StepNode stepNode) { this.stepNode = stepNode; } @@ -150,7 +154,7 @@ void initStepOptions() { } boolean needInit() { - return true; + return !inited; } void onStartInit() { @@ -163,9 +167,11 @@ void onSubmissionLoaded() { } void onFinishInit() { + inited = true; } void onInitFailed() { + inited = false; } public int getSubmissionsCount() { @@ -195,7 +201,18 @@ public int getSubmissionsCount() { return submissionsCount; } + @NotNull public String getType() { - return stepNode.getType().toString().toLowerCase(); + return stepNode.getType().getName(); + } + + @NotNull + public List getComponents() { + return getDataset().getComponents(); + } + + public List getBlanks() { + initStepOptions(); + return reply.getBlanks(); } } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java index e37f975b..a0b20f94 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java @@ -43,6 +43,7 @@ import static com.jetbrains.tmp.learning.StudyUtils.getChoiceStepText; import static com.jetbrains.tmp.learning.StudyUtils.getCodeStepText; import static com.jetbrains.tmp.learning.StudyUtils.getDatasetStepText; +import static com.jetbrains.tmp.learning.StudyUtils.getFillBlanksStepText; import static com.jetbrains.tmp.learning.StudyUtils.getMatchingStepText; import static com.jetbrains.tmp.learning.StudyUtils.getNumberStepText; import static com.jetbrains.tmp.learning.StudyUtils.getSortingStepText; @@ -250,6 +251,9 @@ private void setText() { case TABLE: text = getTableStepText(stepNode); break; + case FILL_BLANKS: + text = getFillBlanksStepText(stepNode); + break; default: text = EMPTY_STEP_TEXT; break; diff --git a/core/src/main/java/org/stepik/core/metrics/Metrics.java b/core/src/main/java/org/stepik/core/metrics/Metrics.java index 3952be3c..1d17f190 100644 --- a/core/src/main/java/org/stepik/core/metrics/Metrics.java +++ b/core/src/main/java/org/stepik/core/metrics/Metrics.java @@ -105,7 +105,7 @@ private static void stepAction( metric.addData("step_id", stepNode.getId()); metric.addTags("step_programming_language", stepNode.getCurrentLang().getName()); StepType stepType = stepNode.getType(); - metric.addTags("step_type", stepType.toString()); + metric.addTags("step_type", stepType.getName()); postMetrics(project, metric, status); } diff --git a/core/src/main/resources/templates/quiz/fill-blanks.ftl b/core/src/main/resources/templates/quiz/fill-blanks.ftl new file mode 100644 index 00000000..7811b087 --- /dev/null +++ b/core/src/main/resources/templates/quiz/fill-blanks.ftl @@ -0,0 +1,80 @@ +<#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper" --> +<#-- @ftlvariable name="text" type="java.lang.String" --> + + + +<#include "base.ftl"> + +<@quiz_content> +
    + <#assign values = stepNode.getBlanks()/> + <#assign index = 0 /> + + <#list stepNode.getComponents() as component> + <#if component.getType() == "text"> + ${component.getText()} + <#else> + <#if (values?size > index) > + <#assign value = values[index]> + <#else> + <#assign value = component.getText()> + + <#assign index++ /> + <#if component.getType() == "input"> + + <#elseif component.getType() == "select"> + + + + + + + \ No newline at end of file diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Component.java b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Component.java new file mode 100644 index 00000000..833de00b --- /dev/null +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Component.java @@ -0,0 +1,57 @@ +package org.stepik.api.objects.attempts; + +import java.util.List; + +/** + * @author meanmail + */ +public class Component { + private List options; + private String type; + private String text; + + public List getOptions() { + return options; + } + + public void setOptions(List options) { + this.options = options; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Component component = (Component) o; + + if (options != null ? !options.equals(component.options) : component.options != null) return false; + //noinspection SimplifiableIfStatement + if (type != null ? !type.equals(component.type) : component.type != null) return false; + return text != null ? text.equals(component.text) : component.text == null; + } + + @Override + public int hashCode() { + int result = options != null ? options.hashCode() : 0; + result = 31 * result + (type != null ? type.hashCode() : 0); + result = 31 * result + (text != null ? text.hashCode() : 0); + return result; + } +} diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Dataset.java b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Dataset.java index 3ad25d3e..d3a715dc 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Dataset.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/Dataset.java @@ -23,6 +23,7 @@ public class Dataset { @SerializedName("is_checkbox") private boolean isCheckbox; private String description; + private List components; @NotNull public List getRows() { @@ -107,6 +108,18 @@ public void setPairs(List pairs) { this.pairs = pairs; } + @NotNull + public List getComponents() { + if (components == null) { + components = new ArrayList<>(); + } + return components; + } + + public void setComponents(@Nullable List components) { + this.components = components; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -121,9 +134,10 @@ public boolean equals(Object o) { if (!Arrays.equals(options, dataset.options)) return false; if (pairs != null ? !pairs.equals(dataset.pairs) : dataset.pairs != null) return false; if (rows != null ? !rows.equals(dataset.rows) : dataset.rows != null) return false; - //noinspection SimplifiableIfStatement if (columns != null ? !columns.equals(dataset.columns) : dataset.columns != null) return false; - return description != null ? description.equals(dataset.description) : dataset.description == null; + //noinspection SimplifiableIfStatement + if (description != null ? !description.equals(dataset.description) : dataset.description != null) return false; + return components != null ? components.equals(dataset.components) : dataset.components == null; } @Override @@ -136,6 +150,7 @@ public int hashCode() { result = 31 * result + (columns != null ? columns.hashCode() : 0); result = 31 * result + (isCheckbox ? 1 : 0); result = 31 * result + (description != null ? description.hashCode() : 0); + result = 31 * result + (components != null ? components.hashCode() : 0); return result; } } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/DatasetDeserializer.java b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/DatasetDeserializer.java index d22f6ad6..a02e40b1 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/DatasetDeserializer.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/attempts/DatasetDeserializer.java @@ -77,6 +77,13 @@ public Dataset deserialize(JsonElement json, Type typeOfT, JsonDeserializationCo dataset.setDescription(description.getAsString()); } + JsonArray components = object.getAsJsonArray("components"); + if (components != null) { + List array = new ArrayList<>(); + components.forEach(component -> array.add(context.deserialize(component, Component.class))); + dataset.setComponents(array); + } + return dataset; } } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java index a5e6f970..25199b15 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java @@ -21,6 +21,7 @@ public class Reply { private List ordering; private String number; private String file; + private List blanks; @NotNull public String getLanguage() { @@ -145,4 +146,16 @@ public List getTableChoices() { //noinspection unchecked return choices; } + + @NotNull + public List getBlanks() { + if (blanks == null) { + blanks = new ArrayList<>(); + } + return blanks; + } + + public void setBlanks(@Nullable List blanks) { + this.blanks = blanks; + } } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/ReplyDeserializer.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/ReplyDeserializer.java index f7093c5e..55a23d56 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/ReplyDeserializer.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/ReplyDeserializer.java @@ -98,6 +98,8 @@ public Reply deserialize(JsonElement json, Type typeOfT, JsonDeserializationCont } } + reply.setBlanks(getStringList(object, "blanks")); + return reply; } } From 3d8c97853a2bbc0abb10692857a5d4c6948cc64f Mon Sep 17 00:00:00 2001 From: meanmail Date: Sat, 18 Mar 2017 05:48:01 +0700 Subject: [PATCH 19/55] Sending (fill-blanks quiz) --- .../tmp/learning/ui/FormListener.java | 266 +++++++++++------- .../org/stepik/plugin/actions/SendAction.java | 5 +- .../StepikSubmissionsPostQuery.java | 6 + 3 files changed, 178 insertions(+), 99 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java index c7e1b1e3..76c5f2db 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java @@ -29,17 +29,19 @@ import org.w3c.dom.html.HTMLCollection; import org.w3c.dom.html.HTMLFormElement; import org.w3c.dom.html.HTMLInputElement; +import org.w3c.dom.html.HTMLSelectElement; import org.w3c.dom.html.HTMLTextAreaElement; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.stream.Collectors; import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; @@ -57,51 +59,40 @@ class FormListener implements EventListener { public void handleEvent(Event event) { String domEventType = event.getType(); if (EVENT_TYPE_SUBMIT.equals(domEventType)) { - HTMLFormElement form = (HTMLFormElement) event.getTarget(); - StudyNode root = StepikProjectManager.getProjectRoot(project); if (root == null) { return; } + HTMLFormElement form = (HTMLFormElement) event.getTarget(); + StudyNode node = StudyUtils.getStudyNode(root, form.getAction()); - if (node == null || !(node instanceof StepNode)) { + if (!(node instanceof StepNode)) { return; } StepNode stepNode = (StepNode) node; - - HTMLCollection elements = form.getElements(); - - String status = ((HTMLInputElement) elements.namedItem("status")).getValue(); - long attemptId = Long.parseLong(((HTMLInputElement) elements - .namedItem("attemptId")).getValue()); - - String typeStr = ((HTMLInputElement) elements - .namedItem("type")).getValue(); - - boolean locked = Boolean.valueOf(((HTMLInputElement) elements - .namedItem("locked")).getValue()); - - HTMLInputElement isFromFileElement = ((HTMLInputElement) elements.namedItem("isFromFile")); - boolean isFromFile = isFromFileElement != null && isFromFileElement.getValue().equals("true"); - - String data = isFromFile ? getDataFromFile(stepNode) : null; - - StepType type = StepType.of(typeStr); + Elements elements = new Elements(form.getElements()); try { - switch (status) { + switch (elements.getStatus()) { case "": case "correct": case "wrong": case "timeLeft": + boolean locked = elements.isLocked(); if (!locked) { getAttempt(stepNode); StudyUtils.setStudyNode(project, node, true); } break; case "active": + String typeStr = elements.getType(); + StepType type = StepType.of(typeStr); + boolean isFromFile = elements.isFromFile(); + String data = isFromFile ? getDataFromFile(stepNode) : null; + long attemptId = elements.getAttemptId(); + if (!isFromFile) { sendStep(stepNode, elements, type, attemptId, null); } else if (data != null) { @@ -150,7 +141,7 @@ private void getAttempt(@NotNull StepNode node) { private void sendStep( @NotNull StepNode stepNode, - @NotNull HTMLCollection elements, + @NotNull Elements elements, @NotNull StepType type, long attemptId, @Nullable String data) { @@ -183,7 +174,7 @@ public void run(@NotNull ProgressIndicator indicator) { case DATASET: String dataset; if (data == null) { - dataset = getDataset(elements); + dataset = getStringData(elements); } else { dataset = data; } @@ -193,11 +184,18 @@ public void run(@NotNull ProgressIndicator indicator) { List tableChoices = getChoices(elements); query.choices(tableChoices); break; + case FILL_BLANKS: + List blanks = getBlanks(elements); + query.blanks(blanks); + break; case SORTING: case MATCHING: List ordering = getOrderingData(elements); query.ordering(ordering); break; + default: + logger.warn("Unknown step type tried sending: " + type); + return; } Submissions submissions = query.execute(); @@ -214,105 +212,177 @@ public void run(@NotNull ProgressIndicator indicator) { }); } - @NotNull - private List getChoiceData(@NotNull HTMLCollection elements) { - HTMLInputElement countElement = (HTMLInputElement) elements.namedItem("count"); - if (countElement == null) { - return Collections.emptyList(); + private void forEachInputElement(@NotNull Elements elements, Consumer consumer) { + for (Node node : elements) { + if (node instanceof HTMLInputElement) { + HTMLInputElement element = (HTMLInputElement) node; + consumer.accept(element); + element.setDisabled(true); + } } + } - int count = Integer.parseInt(countElement.getValue()); - List choices = new ArrayList<>(count); - for (int i = 0; i < elements.getLength(); i++) { - HTMLInputElement option = ((HTMLInputElement) elements.item(i)); - if (option != null) { - if ("option".equals(option.getName())) { - choices.add(option.getChecked()); - } - if (!"hidden".equals(option.getType())) { - option.setDisabled(true); - } + private void disableAllInputs(@NotNull Elements elements) { + for (Node node : elements) { + if (node instanceof HTMLInputElement) { + HTMLInputElement element = (HTMLInputElement) node; + element.setDisabled(true); + } else if (node instanceof HTMLTextAreaElement) { + HTMLTextAreaElement element = (HTMLTextAreaElement) node; + element.setDisabled(true); } } - return choices; } @NotNull - private List getOrderingData(@NotNull HTMLCollection elements) { - HTMLInputElement countElement = (HTMLInputElement) elements.namedItem("count"); - if (countElement == null) { - return Collections.emptyList(); - } + private List getChoiceData(@NotNull Elements elements) { + List choices = new ArrayList<>(); - int count = Integer.parseInt(countElement.getValue()); - List ordering = new ArrayList<>(count); - for (int i = 0; i < elements.getLength(); i++) { + forEachInputElement(elements, element -> { + if ("option".equals(element.getName())) { + choices.add(element.getChecked()); + } + }); - HTMLInputElement option = ((HTMLInputElement) elements.item(i)); - if (option != null) { - if ("index".equals(option.getName())) { - String indexAttr = option.getValue(); - ordering.add(Integer.valueOf(indexAttr)); - } - if (!"hidden".equals(option.getType())) { - option.setDisabled(true); - } + return choices; + } + + @NotNull + private List getOrderingData(@NotNull Elements elements) { + List ordering = new ArrayList<>(); + + forEachInputElement(elements, element -> { + if ("index".equals(element.getName())) { + String indexAttr = element.getValue(); + ordering.add(Integer.valueOf(indexAttr)); } - } + }); return ordering; } - private String getStringData(@NotNull HTMLCollection elements) { - for (int i = 0; i < elements.getLength(); i++) { - HTMLInputElement element = ((HTMLInputElement) elements.item(i)); - if (!"hidden".equals(element.getType())) { + private String getStringData(@NotNull Elements elements) { + disableAllInputs(elements); + return elements.getInputValue("text"); + } + + @NotNull + private List getChoices(@NotNull Elements elements) { + Map> choices = new HashMap<>(); + List rows = new ArrayList<>(); + + forEachInputElement(elements, element -> { + String type = element.getType(); + + if ("checkbox".equals(type) || "radio".equals(type)) { + List columns = choices.computeIfAbsent(element.getName(), k -> { + rows.add(k); + return new ArrayList<>(); + }); + Column column = new Column(element.getValue(), element.getChecked()); + columns.add(column); + } + }); + + return choices.entrySet().stream() + .map(entry -> new Choice(entry.getKey(), entry.getValue())) + .sorted(Comparator.comparingInt(choice -> rows.indexOf(choice.getNameRow()))) + .collect(Collectors.toList()); + } + + private List getBlanks(@NotNull Elements elements) { + List blanks = new ArrayList<>(); + + for (Node node : elements) { + if (node instanceof HTMLInputElement) { + HTMLInputElement element = (HTMLInputElement) node; + String type = element.getType(); + if ("text".equals(type)) { + blanks.add(element.getValue()); + } + element.setDisabled(true); + } else if (node instanceof HTMLSelectElement) { + HTMLSelectElement element = (HTMLSelectElement) node; + blanks.add(element.getValue()); element.setDisabled(true); } } - return ((HTMLInputElement) elements.namedItem("text")).getValue(); + + return blanks; } - private String getDataset(@NotNull HTMLCollection elements) { - for (int i = 0; i < elements.getLength(); i++) { - Node item = elements.item(i); + class Elements implements Iterable { + private final HTMLCollection elements; + + Elements(@NotNull HTMLCollection elements) { + this.elements = elements; + } + + @NotNull + String getStatus() { + Node item = elements.namedItem("status"); if (item instanceof HTMLInputElement) { - HTMLInputElement element = ((HTMLInputElement) elements.item(i)); - if (!"hidden".equals(element.getType())) { - element.setDisabled(true); - } + return ((HTMLInputElement) item).getValue(); } + + return ""; } - return ((HTMLTextAreaElement) elements.namedItem("text")).getValue(); - } - @NotNull - private List getChoices(@NotNull HTMLCollection elements) { - Map> choices = new HashMap<>(); - List rows = new ArrayList<>(); + @NotNull + String getType() { + Node item = elements.namedItem("type"); + if (item instanceof HTMLInputElement) { + return ((HTMLInputElement) item).getValue(); + } - for (int i = 0; i < elements.getLength(); i++) { - Node item = elements.item(i); + return ""; + } + + @NotNull + String getInputValue(@NotNull String name) { + Node item = elements.namedItem(name); if (item instanceof HTMLInputElement) { - HTMLInputElement element = ((HTMLInputElement) elements.item(i)); - String type = element.getType(); + return ((HTMLInputElement) item).getValue(); + } else if (item instanceof HTMLTextAreaElement) { + return ((HTMLTextAreaElement) item).getValue(); + } + return ""; + } - if ("checkbox".equals(type) || "radio".equals(type)) { - List columns = choices.computeIfAbsent(element.getName(), k -> { - rows.add(k); - return new ArrayList<>(); - }); - Column column = new Column(element.getValue(), element.getChecked()); - columns.add(column); - } - if (!"hidden".equals(type)) { - element.setDisabled(true); - } + boolean isFromFile() { + HTMLInputElement element = ((HTMLInputElement) elements.namedItem("isFromFile")); + return element != null && "true".equals(element.getValue()); + } + + long getAttemptId() { + String value = getInputValue("attemptId"); + try { + return Long.parseLong(value); + } catch (NumberFormatException e) { + return 0L; } } - return choices.entrySet().stream() - .map(entry -> new Choice(entry.getKey(), entry.getValue())) - .sorted(Comparator.comparingInt(choice -> rows.indexOf(choice.getNameRow()))) - .collect(Collectors.toList()); + Boolean isLocked() { + return Boolean.valueOf(getInputValue("locked")); + } + + @Override + public Iterator iterator() { + return new Iterator() { + private final int size = elements.getLength(); + private int index; + + @Override + public boolean hasNext() { + return index < size; + } + + @NotNull + @Override + public Node next() { + return elements.item(index++); + } + }; + } } } \ No newline at end of file diff --git a/core/src/main/java/org/stepik/plugin/actions/SendAction.java b/core/src/main/java/org/stepik/plugin/actions/SendAction.java index b0aa0098..0d42746c 100644 --- a/core/src/main/java/org/stepik/plugin/actions/SendAction.java +++ b/core/src/main/java/org/stepik/plugin/actions/SendAction.java @@ -48,7 +48,7 @@ public static void checkStepStatus( indicator.setIndeterminate(false); Submission currentSubmission = null; - while (EVALUATION.equals(stepStatus) && timer < FIVE_MINUTES) { + while (timer < FIVE_MINUTES) { try { Submissions submission = stepikApiClient.submissions() .get() @@ -59,6 +59,9 @@ public static void checkStepStatus( currentSubmission = submission.getSubmissions().get(0); ActionUtils.setupCheckProgress(indicator, currentSubmission, timer); stepStatus = currentSubmission.getStatus(); + if (!EVALUATION.equals(stepStatus)) { + break; + } } Thread.sleep(PERIOD); diff --git a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java index 0a133391..e8e2d642 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java +++ b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java @@ -56,6 +56,12 @@ public StepikSubmissionsPostQuery choices(@Nullable List choices) { return this; } + @NotNull + public StepikSubmissionsPostQuery blanks(@Nullable List blanks) { + submissions.getSubmission().getReply().setBlanks(blanks); + return this; + } + @NotNull public StepikSubmissionsPostQuery ordering(List ordering) { submissions.getSubmission().getReply().setOrdering(ordering); From 599be962aa34fb865cbc6e9eae5edc496db1a5cb Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 19 Mar 2017 01:02:58 +0700 Subject: [PATCH 20/55] Implemented (math quiz) --- .../com/jetbrains/tmp/learning/StudyUtils.java | 6 ++++++ .../tmp/learning/courseFormat/StepType.java | 3 ++- .../courseFormat/stepHelpers/StepHelper.java | 12 ++++++++++++ .../tmp/learning/ui/FormListener.java | 4 ++++ .../tmp/learning/ui/StudyToolWindow.java | 4 ++++ .../src/main/resources/templates/quiz/base.ftl | 6 ++++++ .../src/main/resources/templates/quiz/math.ftl | 18 ++++++++++++++++++ .../stepik/api/objects/submissions/Reply.java | 5 ++++- .../api/objects/submissions/Submission.java | 5 ++++- .../StepikSubmissionsPostQuery.java | 6 ++++++ 10 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 core/src/main/resources/templates/quiz/math.ftl diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java index 41dc8c08..49470019 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java @@ -161,6 +161,12 @@ public static String getFillBlanksStepText(@NotNull StepNode stepNode) { return processTemplate(stepNodeHelper, "quiz/fill-blanks"); } + @NotNull + public static String getMathStepText(@NotNull StepNode stepNode) { + StepHelper stepNodeHelper = stepNode.asStepHelper(); + return processTemplate(stepNodeHelper, "quiz/math"); + } + @NotNull private static String processTemplate(@NotNull StepHelper stepNodeHelper, @NotNull String templateName) { String text = getTextStepText(stepNodeHelper.getStepNode()); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java index fd3631ca..848c4332 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java @@ -21,7 +21,8 @@ public enum StepType { NUMBER("number"), DATASET("dataset"), TABLE("table"), - FILL_BLANKS("fill-blanks"); + FILL_BLANKS("fill-blanks"), + MATH("math"); private static Map map; private final String name; diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java index 323bbb67..0b181bcb 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java @@ -215,4 +215,16 @@ public List getBlanks() { initStepOptions(); return reply.getBlanks(); } + + @NotNull + public String getFormula() { + initStepOptions(); + return reply.getFormula(); + } + + @NotNull + public String getHint() { + initStepOptions(); + return submission.getHint(); + } } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java index 76c5f2db..f5bd87b5 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java @@ -193,6 +193,10 @@ public void run(@NotNull ProgressIndicator indicator) { List ordering = getOrderingData(elements); query.ordering(ordering); break; + case MATH: + String formula = getStringData(elements); + query.formula(formula); + break; default: logger.warn("Unknown step type tried sending: " + type); return; diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java index a0b20f94..a3d1dafd 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java @@ -45,6 +45,7 @@ import static com.jetbrains.tmp.learning.StudyUtils.getDatasetStepText; import static com.jetbrains.tmp.learning.StudyUtils.getFillBlanksStepText; import static com.jetbrains.tmp.learning.StudyUtils.getMatchingStepText; +import static com.jetbrains.tmp.learning.StudyUtils.getMathStepText; import static com.jetbrains.tmp.learning.StudyUtils.getNumberStepText; import static com.jetbrains.tmp.learning.StudyUtils.getSortingStepText; import static com.jetbrains.tmp.learning.StudyUtils.getStringStepText; @@ -254,6 +255,9 @@ private void setText() { case FILL_BLANKS: text = getFillBlanksStepText(stepNode); break; + case MATH: + text = getMathStepText(stepNode); + break; default: text = EMPTY_STEP_TEXT; break; diff --git a/core/src/main/resources/templates/quiz/base.ftl b/core/src/main/resources/templates/quiz/base.ftl index 4d8ebb63..d459563f 100644 --- a/core/src/main/resources/templates/quiz/base.ftl +++ b/core/src/main/resources/templates/quiz/base.ftl @@ -21,6 +21,12 @@ ${text}

    Correct

    + <#if status == "wrong"> +
    + ${stepNode.getHint()} +
    + + <#nested/> diff --git a/core/src/main/resources/templates/quiz/math.ftl b/core/src/main/resources/templates/quiz/math.ftl new file mode 100644 index 00000000..f975f55e --- /dev/null +++ b/core/src/main/resources/templates/quiz/math.ftl @@ -0,0 +1,18 @@ +<#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper" --> +<#-- @ftlvariable name="text" type="java.lang.String" --> + + + +<#include "base.ftl"> + +<@quiz_content> + + + \ No newline at end of file diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java index 25199b15..3e99c90e 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Reply.java @@ -47,8 +47,11 @@ public void setCode(@Nullable String code) { this.code = code; } - @Nullable + @NotNull public String getFormula() { + if (formula == null) { + formula = ""; + } return formula; } diff --git a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Submission.java b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Submission.java index 460e925b..b9b00bda 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Submission.java +++ b/stepik-java-api/src/main/java/org/stepik/api/objects/submissions/Submission.java @@ -74,8 +74,11 @@ public void setScore(double score) { this.score = score; } - @Nullable + @NotNull public String getFeedback() { + if (feedback == null) { + feedback = ""; + } return feedback; } diff --git a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java index e8e2d642..22d14ed5 100644 --- a/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java +++ b/stepik-java-api/src/main/java/org/stepik/api/queries/submissions/StepikSubmissionsPostQuery.java @@ -38,6 +38,12 @@ public StepikSubmissionsPostQuery text(@Nullable String text) { return this; } + @NotNull + public StepikSubmissionsPostQuery formula(@Nullable String formula) { + submissions.getSubmission().getReply().setFormula(formula); + return this; + } + @NotNull public StepikSubmissionsPostQuery number(@Nullable String number) { submissions.getSubmission().getReply().setNumber(number); From 540be5d56c0fcc3b2f69b5f61dcc3456229c80f1 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sat, 11 Mar 2017 22:18:39 +0700 Subject: [PATCH 21/55] Added auth dialog --- .../learning/stepik/StepikConnectorLogin.java | 43 +++++- .../org/stepik/plugin/auth/ui/AuthDialog.java | 128 ++++++++++++++++++ .../ui/ProjectSettingsPanel.java | 3 +- 3 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index e00fec55..a62eac71 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -16,15 +16,28 @@ import org.stepik.api.objects.auth.TokenInfo; import org.stepik.api.objects.users.User; import org.stepik.core.metrics.Metrics; +import org.stepik.plugin.auth.ui.AuthDialog; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; + +import static java.nio.charset.StandardCharsets.UTF_8; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; public class StepikConnectorLogin { private static final Logger logger = Logger.getInstance(StepikConnectorLogin.class); - private static final String CLIENT_ID = "hUCWcq3hZHCmz0DKrDtwOWITLcYutzot7p4n59vU"; + private static final String CLIENT_ID = "vV8giW7KTPMOTriOUBwyGLvXbKV0Cc4GPBnyCJPd"; + private static final String REDIRECT_URI = "https://stepik.org"; private static final String LAST_USER_PROPERTY_NAME = PLUGIN_ID + ".LAST_USER"; private static final StepikApiClient stepikApiClient = initStepikApiClient(); + private static final String IMPLICIT_GRANT_URL_TEMPLATE = "https://stepik.org/oauth2/authorize/" + + "?client_id=" + CLIENT_ID + + "&redirect_uri=%s" + + "&scope=write" + + "&state=%s" + + "&response_type=token"; private static long getLastUser() { return PropertiesComponent.getInstance().getOrInitLong(LAST_USER_PROPERTY_NAME, 0); @@ -68,15 +81,21 @@ private static StepikApiClient initStepikApiClient() { public static void authentication() { AuthInfo authInfo = getAuthInfo(getLastUser()); if (!minorLogin(authInfo)) { - showAuthDialog(); + showAuthDialog(false); } } - private static void showAuthDialog() { + private static void showAuthDialog(boolean clear) { ApplicationManager.getApplication().invokeAndWait(() -> { logger.info("Show the authentication dialog"); - final LoginDialog dialog = new LoginDialog(); - dialog.show(); + Map map = AuthDialog.showAuthForm(clear); + + TokenInfo tokenInfo = stepikApiClient.getTokenInfo(); + tokenInfo.setAccessToken(map.get("access_token")); + tokenInfo.setExpiresIn(Integer.valueOf(map.getOrDefault("expires_in", "0"))); + tokenInfo.setScope(map.get("scope")); + tokenInfo.setTokenType(map.get("token_type")); + tokenInfo.setRefreshToken(null); }, ModalityState.defaultModalityState()); } @@ -254,4 +273,18 @@ public static void logout() { logger.info("Logout successfully"); } } + + @Nullable + public static String getImplicitGrantUrl() { + try { + return String.format(IMPLICIT_GRANT_URL_TEMPLATE, URLEncoder.encode(REDIRECT_URI, UTF_8.name()), "1234"); + } catch (UnsupportedEncodingException e) { + return null; + } + } + + public static void logoutAndAuth() { + logout(); + showAuthDialog(true); + } } \ No newline at end of file diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java new file mode 100644 index 00000000..cdc3cb67 --- /dev/null +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -0,0 +1,128 @@ +package org.stepik.plugin.auth.ui; + +import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.concurrent.Worker; +import javafx.embed.swing.JFXPanel; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.ProgressBar; +import javafx.scene.layout.StackPane; +import javafx.scene.web.WebEngine; +import javafx.scene.web.WebView; +import org.stepik.api.urls.Urls; + +import javax.swing.*; +import java.awt.*; +import java.net.CookieHandler; +import java.net.CookieManager; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author meanmail + */ +public class AuthDialog extends JDialog { + private final Map map = new HashMap<>(); + private WebEngine engine; + private WebView webComponent; + private Node progressBar; + private JFXPanel panel; + + private AuthDialog(boolean clear) { + super((Frame) null, true); + setTitle("Authorize"); + setSize(new Dimension(640, 480)); + setLocationRelativeTo(null); + setLayout(new BorderLayout()); + setPanel(new JFXPanel()); + Platform.runLater(() -> { + StackPane pane = new StackPane(); + webComponent = new WebView(); + engine = webComponent.getEngine(); + progressBar = makeProgressBarWithListener(); + webComponent.setVisible(false); + pane.getChildren().addAll(webComponent, progressBar); + Scene scene = new Scene(pane); + panel.setScene(scene); + panel.setVisible(true); + + if (clear) { + CookieManager manager = new CookieManager(); + CookieHandler.setDefault(manager); + manager.getCookieStore().removeAll(); + } + String url = StepikConnectorLogin.getImplicitGrantUrl(); + engine.load(url); + }); + add(panel, BorderLayout.CENTER); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + } + + public static Map showAuthForm(boolean clear) { + AuthDialog instance = new AuthDialog(clear); + instance.setVisible(true); + return instance.map; + } + + private ProgressBar makeProgressBarWithListener() { + final ProgressBar progress = new ProgressBar(); + Worker loadWorker = engine.getLoadWorker(); + progress.progressProperty().bind(loadWorker.progressProperty()); + + loadWorker.stateProperty().addListener( + new ChangeListener() { + @Override + public void changed( + ObservableValue ov, + Worker.State oldState, + Worker.State newState) { + if (newState == Worker.State.CANCELLED) { + return; + } + String location = engine.getLocation(); + System.out.println(location); + if (location != null) { + if (location.startsWith(Urls.STEPIK_URL + "/#")) { + String paramString = location.split("#")[1]; + String[] params = paramString.split("&"); + map.clear(); + Arrays.stream(params).forEach(param -> { + String[] entry = param.split("="); + String value = ""; + if (entry.length > 0) { + value = entry[1]; + } + map.put(entry[0], value); + }); + hide(); + return; + } else if ((Urls.STEPIK_URL + "/?error=access_denied").equals(location)) { + hide(); + return; + } + } + + if (newState == Worker.State.SUCCEEDED) { + progressBar.setVisible(false); + webComponent.setVisible(true); + AuthDialog.this.setTitle(engine.getTitle()); + } + } + + private void hide() { + loadWorker.cancel(); + setVisible(false); + } + }); + + return progress; + } + + private void setPanel(JFXPanel panel) { + this.panel = panel; + } +} diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java index 9c3b8a04..4599271a 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java @@ -44,8 +44,7 @@ public ProjectSettingsPanel(@NotNull Project project, boolean visibleLangBox) { mainPanel.addHierarchyListener(this); logoutButton.addActionListener(e -> { - StepikConnectorLogin.logout(); - StepikConnectorLogin.authentication(); + StepikConnectorLogin.logoutAndAuth(); setUsername(); }); } From d1b2dec6685c99f27fc01d045d07779c274c603c Mon Sep 17 00:00:00 2001 From: meanmail Date: Sat, 11 Mar 2017 22:27:05 +0700 Subject: [PATCH 22/55] Removed login dialog --- .../tmp/learning/stepik/LoginDialog.java | 90 ------------------- .../jetbrains/tmp/learning/ui/LoginPanel.form | 59 ------------ .../jetbrains/tmp/learning/ui/LoginPanel.java | 66 -------------- .../org/stepik/plugin/auth/ui/AuthDialog.java | 2 +- 4 files changed, 1 insertion(+), 216 deletions(-) delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java deleted file mode 100644 index 614f6bf1..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.jetbrains.tmp.learning.stepik; - -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.util.ThrowableComputable; -import com.intellij.openapi.util.text.StringUtil; -import com.jetbrains.tmp.learning.ui.LoginPanel; -import org.jetbrains.annotations.NotNull; -import org.stepik.api.exceptions.StepikClientException; -import org.stepik.api.exceptions.StepikUnauthorizedException; -import org.stepik.core.utils.Utils; - -import javax.swing.*; - -public class LoginDialog extends DialogWrapper { - private final LoginPanel loginPanel; - - LoginDialog() { - super(false); - loginPanel = new LoginPanel(this); - setTitle("Authentication at Stepik"); - setOKButtonText("Login"); - init(); - } - - @NotNull - protected Action[] createActions() { - return new Action[]{getOKAction(), getCancelAction()}; - } - - @Override - protected JComponent createCenterPanel() { - return loginPanel.getContentPanel(); - } - - @Override - protected String getHelpId() { - return "login_to_stepik"; - } - - @Override - public JComponent getPreferredFocusedComponent() { - return loginPanel.getPreferableFocusComponent(); - } - - @Override - protected void doOKAction() { - if (!validateLoginAndPasswordFields()) { - return; - } - - try { - String login = loginPanel.getLogin(); - String password = loginPanel.getPassword(); - - ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - StepikConnectorLogin.authenticate(login, password); - return null; - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - doJustOkAction(); - } catch (StepikUnauthorizedException e) { - setErrorText("Wrong a login or a password"); - } catch (StepikClientException e) { - setErrorText("Connection failed"); - } - } - - private boolean validateLoginAndPasswordFields() { - if (StringUtil.isEmptyOrSpaces(loginPanel.getLogin())) { - setErrorText("Please, enter your username"); - return false; - } - if (StringUtil.isEmptyOrSpaces(loginPanel.getPassword())) { - setErrorText("Please, enter your password"); - return false; - } - return true; - } - - private void doJustOkAction() { - super.doOKAction(); - } - - public void clearErrors() { - setErrorText(null); - } -} \ No newline at end of file diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form b/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form deleted file mode 100644 index 5bbc0864..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form +++ /dev/null @@ -1,59 +0,0 @@ - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java deleted file mode 100644 index aea95b45..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jetbrains.tmp.learning.ui; - -import com.intellij.ide.BrowserUtil; -import com.intellij.ui.DocumentAdapter; -import com.intellij.ui.components.JBLabel; -import com.jetbrains.tmp.learning.stepik.EduStepikNames; -import com.jetbrains.tmp.learning.stepik.LoginDialog; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -public class LoginPanel { - private JPanel contentPanel; - private JPasswordField passwordField; - private JTextField loginField; - private JBLabel signUpLabel; - - public LoginPanel(final LoginDialog dialog) { - DocumentListener listener = new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - dialog.clearErrors(); - } - }; - - loginField.getDocument().addDocumentListener(listener); - passwordField.getDocument().addDocumentListener(listener); - - signUpLabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - BrowserUtil.browse(EduStepikNames.STEPIK_SIGN_IN_LINK); - } - - @Override - public void mouseEntered(MouseEvent e) { - e.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - - @Override - public void mouseExited(MouseEvent e) { - e.getComponent().setCursor(Cursor.getDefaultCursor()); - } - }); - } - - public JPanel getContentPanel() { - return contentPanel; - } - - public String getPassword() { - return String.valueOf(passwordField.getPassword()); - } - - public String getLogin() { - return loginField.getText(); - } - - public JComponent getPreferableFocusComponent() { - return loginField; - } -} diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index cdc3cb67..0dc66032 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -84,7 +84,7 @@ public void changed( return; } String location = engine.getLocation(); - System.out.println(location); + if (location != null) { if (location.startsWith(Urls.STEPIK_URL + "/#")) { String paramString = location.split("#")[1]; From 410fbfa9d316a89093803a80f329e6c9ec1eef77 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 00:14:28 +0700 Subject: [PATCH 23/55] Show error page when connection failed --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 10 +++++ core/src/main/resources/templates/error.ftl | 45 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 core/src/main/resources/templates/error.ftl diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 0dc66032..b6df9267 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -13,6 +13,7 @@ import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import org.stepik.api.urls.Urls; +import org.stepik.core.templates.Templater; import javax.swing.*; import java.awt.*; @@ -83,6 +84,15 @@ public void changed( if (newState == Worker.State.CANCELLED) { return; } + + if (newState == Worker.State.FAILED) { + Map map = new HashMap<>(); + map.put("url", engine.getLocation()); + String content = Templater.processTemplate("error", map); + engine.loadContent(content); + return; + } + String location = engine.getLocation(); if (location != null) { diff --git a/core/src/main/resources/templates/error.ftl b/core/src/main/resources/templates/error.ftl new file mode 100644 index 00000000..f75f879a --- /dev/null +++ b/core/src/main/resources/templates/error.ftl @@ -0,0 +1,45 @@ +<#-- @ftlvariable name="url" type="java.lang.String" --> + + + + Error + + + + +

    Connection failed

    +
    +
      +
    • Check internet connection options
    • +
    + +Try again + + \ No newline at end of file From a947d9a651b12d280ad75805833ddd72a7f1aa51 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 01:45:56 +0700 Subject: [PATCH 24/55] Added goBack button --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 58 ++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index b6df9267..5fe37fb4 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -1,22 +1,32 @@ package org.stepik.plugin.auth.ui; +import com.intellij.icons.AllIcons; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.embed.swing.JFXPanel; +import javafx.embed.swing.SwingFXUtils; +import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Scene; +import javafx.scene.control.Button; import javafx.scene.control.ProgressBar; -import javafx.scene.layout.StackPane; +import javafx.scene.image.ImageView; +import javafx.scene.image.WritableImage; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; import javafx.scene.web.WebEngine; +import javafx.scene.web.WebHistory; import javafx.scene.web.WebView; import org.stepik.api.urls.Urls; import org.stepik.core.templates.Templater; import javax.swing.*; import java.awt.*; +import java.awt.image.BufferedImage; import java.net.CookieHandler; import java.net.CookieManager; import java.util.Arrays; @@ -29,7 +39,6 @@ public class AuthDialog extends JDialog { private final Map map = new HashMap<>(); private WebEngine engine; - private WebView webComponent; private Node progressBar; private JFXPanel panel; @@ -40,17 +49,26 @@ private AuthDialog(boolean clear) { setLocationRelativeTo(null); setLayout(new BorderLayout()); setPanel(new JFXPanel()); + Platform.runLater(() -> { - StackPane pane = new StackPane(); - webComponent = new WebView(); + BorderPane pane = new BorderPane(); + HBox toolPane = new HBox(); + toolPane.setSpacing(5); + toolPane.setAlignment(Pos.CENTER_LEFT); + WebView webComponent = new WebView(); engine = webComponent.getEngine(); progressBar = makeProgressBarWithListener(); - webComponent.setVisible(false); - pane.getChildren().addAll(webComponent, progressBar); + pane.setTop(toolPane); + pane.setCenter(webComponent); Scene scene = new Scene(pane); panel.setScene(scene); panel.setVisible(true); + Button backButton = makeGoBackButton(); + addButtonsAvailabilityListeners(backButton); + toolPane.getChildren().addAll(backButton, progressBar); + toolPane.setPadding(new Insets(5)); + if (clear) { CookieManager manager = new CookieManager(); CookieHandler.setDefault(manager); @@ -69,6 +87,30 @@ public static Map showAuthForm(boolean clear) { return instance.map; } + private void addButtonsAvailabilityListeners(Button goBackButton) { + Platform.runLater(() -> engine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> { + if (newState == Worker.State.SUCCEEDED) { + WebHistory history = engine.getHistory(); + boolean isGoBackDisable = history.getCurrentIndex() <= 0; + goBackButton.setDisable(isGoBackDisable); + } + })); + } + + private Button makeGoBackButton() { + Icon icon = AllIcons.Actions.Back; + BufferedImage bImg = new BufferedImage(icon.getIconWidth(), icon.getIconWidth(), BufferedImage.TYPE_INT_ARGB); + Graphics2D graphics = bImg.createGraphics(); + icon.paintIcon(null, graphics, 0, 0); + graphics.dispose(); + WritableImage image = SwingFXUtils.toFXImage(bImg, null); + final Button button = new Button(null, new ImageView(image)); + button.setDisable(true); + button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); + + return button; + } + private ProgressBar makeProgressBarWithListener() { final ProgressBar progress = new ProgressBar(); Worker loadWorker = engine.getLoadWorker(); @@ -116,9 +158,9 @@ public void changed( } } + progressBar.setVisible(newState == Worker.State.RUNNING); + if (newState == Worker.State.SUCCEEDED) { - progressBar.setVisible(false); - webComponent.setVisible(true); AuthDialog.this.setTitle(engine.getTitle()); } } From 87c067e6a069436a464e4a10036f5c8726dc3afb Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 14:50:29 +0700 Subject: [PATCH 25/55] Added home button --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 5fe37fb4..8426bdce 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -21,6 +21,7 @@ import javafx.scene.web.WebEngine; import javafx.scene.web.WebHistory; import javafx.scene.web.WebView; +import org.jetbrains.annotations.NotNull; import org.stepik.api.urls.Urls; import org.stepik.core.templates.Templater; @@ -38,6 +39,7 @@ */ public class AuthDialog extends JDialog { private final Map map = new HashMap<>(); + private String url; private WebEngine engine; private Node progressBar; private JFXPanel panel; @@ -66,7 +68,8 @@ private AuthDialog(boolean clear) { Button backButton = makeGoBackButton(); addButtonsAvailabilityListeners(backButton); - toolPane.getChildren().addAll(backButton, progressBar); + Button homeButton = makeHomeButton(); + toolPane.getChildren().addAll(backButton, homeButton, progressBar); toolPane.setPadding(new Insets(5)); if (clear) { @@ -74,7 +77,7 @@ private AuthDialog(boolean clear) { CookieHandler.setDefault(manager); manager.getCookieStore().removeAll(); } - String url = StepikConnectorLogin.getImplicitGrantUrl(); + url = StepikConnectorLogin.getImplicitGrantUrl(); engine.load(url); }); add(panel, BorderLayout.CENTER); @@ -98,17 +101,28 @@ private void addButtonsAvailabilityListeners(Button goBackButton) { } private Button makeGoBackButton() { - Icon icon = AllIcons.Actions.Back; + Button button = createButtonWithImage(AllIcons.Actions.Back); + button.setDisable(true); + button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); + + return button; + } + + private Button makeHomeButton() { + Button button = createButtonWithImage(AllIcons.Actions.Refresh); + button.setOnAction(event -> Platform.runLater(() -> engine.load(url))); + + return button; + } + + @NotNull + private Button createButtonWithImage(@NotNull Icon icon) { BufferedImage bImg = new BufferedImage(icon.getIconWidth(), icon.getIconWidth(), BufferedImage.TYPE_INT_ARGB); Graphics2D graphics = bImg.createGraphics(); icon.paintIcon(null, graphics, 0, 0); graphics.dispose(); WritableImage image = SwingFXUtils.toFXImage(bImg, null); - final Button button = new Button(null, new ImageView(image)); - button.setDisable(true); - button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); - - return button; + return new Button(null, new ImageView(image)); } private ProgressBar makeProgressBarWithListener() { From 0f18a9355875d93dac78f7fec9d43a37ebdc5b89 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 16:30:31 +0700 Subject: [PATCH 26/55] Removed login with password from settings --- .../tmp/learning/stepik/AuthInfo.java | 51 ------ .../learning/stepik/StepikConnectorLogin.java | 117 +++---------- .../collective/ui/StepikSettingsPanel.form | 89 +++------- .../collective/ui/StepikSettingsPanel.java | 165 ++---------------- 4 files changed, 65 insertions(+), 357 deletions(-) delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java deleted file mode 100644 index 74443a73..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.jetbrains.tmp.learning.stepik; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.stepik.api.objects.auth.TokenInfo; - -/** - * @author meanmail - */ -class AuthInfo { - private TokenInfo tokenInfo; - private String password; - private String username; - - @Nullable - TokenInfo getTokenInfo() { - return tokenInfo; - } - - void setTokenInfo(@Nullable TokenInfo tokenInfo) { - this.tokenInfo = tokenInfo; - } - - @NotNull - String getPassword() { - if (password == null) { - password = ""; - } - return password; - } - - void setPassword(@Nullable String password) { - this.password = password; - } - - @NotNull - String getUsername() { - if (username == null) { - username = ""; - } - return username; - } - - void setUsername(@Nullable String username) { - this.username = username; - } - - boolean canBeValid() { - return username != null && !username.isEmpty() && password != null && !password.isEmpty(); - } -} diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index a62eac71..334b72b8 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -62,9 +62,9 @@ private static StepikApiClient initStepikApiClient() { long lastUserId = getLastUser(); - AuthInfo authInfo = getAuthInfo(lastUserId, client); + TokenInfo tokenInfo = getTokenInfo(lastUserId, client); - client.setTokenInfo(authInfo.getTokenInfo()); + client.setTokenInfo(tokenInfo); return client; } @@ -78,9 +78,9 @@ private static StepikApiClient initStepikApiClient() { *
  • Show a dialog box for getting an username and a password
  • * */ - public static void authentication() { - AuthInfo authInfo = getAuthInfo(getLastUser()); - if (!minorLogin(authInfo)) { + public static synchronized void authentication() { + TokenInfo tokenInfo = getTokenInfo(getLastUser()); + if (!minorLogin(tokenInfo)) { showAuthDialog(false); } } @@ -90,16 +90,20 @@ private static void showAuthDialog(boolean clear) { logger.info("Show the authentication dialog"); Map map = AuthDialog.showAuthForm(clear); - TokenInfo tokenInfo = stepikApiClient.getTokenInfo(); + TokenInfo tokenInfo = new TokenInfo(); tokenInfo.setAccessToken(map.get("access_token")); tokenInfo.setExpiresIn(Integer.valueOf(map.getOrDefault("expires_in", "0"))); tokenInfo.setScope(map.get("scope")); tokenInfo.setTokenType(map.get("token_type")); - tokenInfo.setRefreshToken(null); + tokenInfo.setRefreshToken(map.get("refresh_token")); + stepikApiClient.setTokenInfo(tokenInfo); + if (tokenInfo.getAccessToken() != null) { + Metrics.authenticate(SUCCESSFUL); + } }, ModalityState.defaultModalityState()); } - private static boolean minorLogin(@NotNull AuthInfo authInfo) { + private static boolean minorLogin(@NotNull TokenInfo tokenInfo) { logger.info("Check the authentication"); if (stepikApiClient.getTokenInfo().getAccessToken() != null) { @@ -112,8 +116,8 @@ private static boolean minorLogin(@NotNull AuthInfo authInfo) { } String refreshToken = stepikApiClient.getTokenInfo().getRefreshToken(); - if (refreshToken == null && authInfo.getTokenInfo() != null) { - refreshToken = authInfo.getTokenInfo().getRefreshToken(); + if (refreshToken == null) { + refreshToken = tokenInfo.getRefreshToken(); } if (refreshToken != null) { @@ -129,29 +133,18 @@ private static boolean minorLogin(@NotNull AuthInfo authInfo) { } } - if (authInfo.canBeValid()) { - try { - logger.info("Try execute the Authentication with a password"); - authenticate(authInfo.getUsername(), authInfo.getPassword()); - logger.info("The Authentication with a password is successfully"); - return true; - } catch (StepikClientException e) { - logger.info("The Authentication with a password failed: " + e.getMessage()); - } - } - return false; } @NotNull - private static AuthInfo getAuthInfo(long userId) { - return getAuthInfo(userId, stepikApiClient); + private static TokenInfo getTokenInfo(long userId) { + return getTokenInfo(userId, stepikApiClient); } @NotNull - private static AuthInfo getAuthInfo(long userId, StepikApiClient client) { + private static TokenInfo getTokenInfo(long userId, StepikApiClient client) { if (userId == 0) { - return new AuthInfo(); + return new TokenInfo(); } String serviceName = StepikProjectManager.class.getName(); CredentialAttributes attributes = new CredentialAttributes(serviceName, @@ -162,27 +155,21 @@ private static AuthInfo getAuthInfo(long userId, StepikApiClient client) { synchronized (StepikConnectorLogin.class) { serializedAuthInfo = PasswordSafe.getInstance().getPassword(attributes); } - AuthInfo authInfo = client.getJsonConverter().fromJson(serializedAuthInfo, AuthInfo.class); + TokenInfo authInfo = client.getJsonConverter().fromJson(serializedAuthInfo, TokenInfo.class); if (authInfo == null) { - return new AuthInfo(); + return new TokenInfo(); } return authInfo; } - @NotNull - public static String getCurrentUserPassword() { - User currentUser = getCurrentUser(); - return getAuthInfo(currentUser.getId()).getPassword(); - } - - private static void setAuthInfo(long userId, @NotNull final AuthInfo authInfo) { + private static void setAuthInfo(long userId, @NotNull final TokenInfo tokenInfo) { String serviceName = StepikProjectManager.class.getName(); CredentialAttributes attributes = new CredentialAttributes(serviceName, String.valueOf(userId), StepikProjectManager.class, false); - String serializedAuthInfo = stepikApiClient.getJsonConverter().toJson(authInfo); + String serializedAuthInfo = stepikApiClient.getJsonConverter().toJson(tokenInfo); synchronized (StepikConnectorLogin.class) { PasswordSafe.getInstance().setPassword(attributes, serializedAuthInfo); setLastUser(userId); @@ -194,25 +181,6 @@ public static StepikApiClient getStepikApiClient() { return stepikApiClient; } - @NotNull - public static User testAuthentication(@Nullable String username, @Nullable String password) { - TokenInfo currentTokenInfo = stepikApiClient.getTokenInfo(); - - User testUser; - try { - authenticate(username, password); - logger.info("The test authentication is successfully"); - testUser = getCurrentUser(); - } catch (StepikClientException e) { - logger.info("The test authentication failed"); - throw e; - } finally { - stepikApiClient.setTokenInfo(currentTokenInfo); - } - - return testUser; - } - @NotNull public static User getCurrentUser() { try { @@ -226,33 +194,6 @@ public static User getCurrentUser() { } } - public static void authenticate(@Nullable String username, @Nullable String password) { - try { - stepikApiClient.oauth2() - .userAuthenticationPassword(CLIENT_ID, username, password) - .execute(); - - AuthInfo authInfo = new AuthInfo(); - authInfo.setTokenInfo(stepikApiClient.getTokenInfo()); - authInfo.setUsername(username); - authInfo.setPassword(password); - - long userId = getCurrentUser().getId(); - setAuthInfo(userId, authInfo); - logger.info("Authentication is successfully"); - Metrics.authenticate(SUCCESSFUL); - } catch (StepikClientException e) { - logger.warn("Authentication failed", e); - throw e; - } - } - - @NotNull - public static String getCurrentUsername() { - User currentUser = getCurrentUser(); - return getAuthInfo(currentUser.getId()).getUsername(); - } - @NotNull public static String getCurrentUserFullName() { User user = getCurrentUser(); @@ -264,14 +205,12 @@ public static StepikApiClient authAndGetStepikApiClient() { return stepikApiClient; } - public static void logout() { - synchronized (StepikConnectorLogin.class) { - stepikApiClient.setTokenInfo(null); - long userId = getLastUser(); - setAuthInfo(userId, new AuthInfo()); - setLastUser(0); - logger.info("Logout successfully"); - } + public static synchronized void logout() { + stepikApiClient.setTokenInfo(null); + long userId = getLastUser(); + setAuthInfo(userId, new TokenInfo()); + setLastUser(0); + logger.info("Logout successfully"); } @Nullable diff --git a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form index f7165b95..33c894c4 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form +++ b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form @@ -1,9 +1,9 @@
    - + - + @@ -11,23 +11,6 @@ - - - - - - - - - - - - - - - - - @@ -35,47 +18,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -83,34 +31,41 @@ - + - + + + + + + - - + - + - + - + - + - + - + - + + + + diff --git a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java index bcd3941c..49a79deb 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java +++ b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java @@ -1,202 +1,67 @@ package org.stepik.plugin.collective.ui; -import com.intellij.ide.BrowserUtil; -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.ThrowableComputable; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.ui.DocumentAdapter; -import com.intellij.ui.HyperlinkAdapter; import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.stepik.EduStepikNames; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; -import org.intellij.lang.annotations.Language; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.stepik.api.exceptions.StepikClientException; -import org.stepik.api.exceptions.StepikUnauthorizedException; -import org.stepik.api.objects.users.User; import org.stepik.core.utils.Utils; import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.HyperlinkEvent; -import javax.swing.text.Document; -import javax.swing.text.PlainDocument; -import java.awt.*; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; - -import static com.intellij.openapi.ui.Messages.showMessageDialog; -import static com.intellij.openapi.ui.Messages.showWarningDialog; class StepikSettingsPanel { - private static final String DEFAULT_PASSWORD_TEXT = "************"; - private static final String TEST_CONNECTION = "Test connection"; - private static final String CHECK_CREDENTIALS = "Check credentials"; - private static final String WRONG_LOGIN_PASSWORD = "Wrong a login or a password"; - private static final String FAILED_CONNECTION = "Failed connection"; - private JTextField emailTextField; - private JPasswordField passwordField; - private JTextPane signupTextField; private JPanel pane; - private JButton testButton; private JCheckBox hintCheckBox; private JButton logoutButton; + private JLabel userName; + private JButton loginButton; - private boolean credentialsModified; private boolean hintCheckBoxModified; private StepikProjectManager projectManager; StepikSettingsPanel() { initProjectOfSettings(); - signupTextField.addHyperlinkListener(new HyperlinkAdapter() { - @Override - protected void hyperlinkActivated(final HyperlinkEvent e) { - BrowserUtil.browse(e.getURL()); - } - }); - @Language("HTML") - String signupText = "Do not have an account at stepik.org? Sign up"; - signupTextField.setText(String.format(signupText, EduStepikNames.STEPIK_SIGN_IN_LINK)); - signupTextField.setBackground(pane.getBackground()); - signupTextField.setCursor(new Cursor(Cursor.HAND_CURSOR)); hintCheckBox.setSelected(projectManager != null && projectManager.getShowHint()); hintCheckBox.addActionListener(e -> hintCheckBoxModified = true); - testButton.addActionListener(event -> { - try { - String login = getEmail(); - String password = getPassword(); - - User user = ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - return StepikConnectorLogin.testAuthentication(login, password); - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - String fullName = user.getFirstName() + " " + user.getLastName(); - String message = "Hello, " + fullName + "!\n I am glad to see you."; - showMessageDialog(message, TEST_CONNECTION, Messages.getInformationIcon()); - } catch (StepikUnauthorizedException e) { - showWarningDialog(WRONG_LOGIN_PASSWORD, TEST_CONNECTION); - } catch (StepikClientException e) { - showWarningDialog(FAILED_CONNECTION, TEST_CONNECTION); - } - }); - - emailTextField.getDocument().addDocumentListener(new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - if (!credentialsModified) { - erasePassword(); - } - } - }); - - passwordField.addFocusListener(new FocusAdapter() { - @Override - public void focusGained(FocusEvent e) { - if (!credentialsModified && !getPassword().isEmpty()) { - erasePassword(); - } - } - }); - - passwordField.getDocument().addDocumentListener(new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - credentialsModified = true; - } - }); logoutButton.addActionListener(e -> { - reset(); StepikConnectorLogin.logout(); + updateUserName(); + }); + + loginButton.addActionListener(e -> { + StepikConnectorLogin.authentication(); + updateUserName(); }); } - private void erasePassword() { - setPasswordFieldText(""); - credentialsModified = true; + private void updateUserName() { + userName.setText(StepikConnectorLogin.getCurrentUserFullName()); } JComponent getPanel() { return pane; } - @NotNull - private String getEmail() { - return emailTextField.getText().trim(); - } - - private void setLogin(@Nullable final String login) { - emailTextField.setText(login); - } - - @NotNull - private String getPassword() { - if (!credentialsModified) { - initProjectOfSettings(); - return StepikConnectorLogin.getCurrentUserPassword(); - } - return String.valueOf(passwordField.getPassword()); - } - - private void setPasswordFieldText(@NotNull final String password) { - // Show password as blank if password is empty - passwordField.setText(StringUtil.isEmpty(password) ? "" : password); - } - private void initProjectOfSettings() { projectManager = StepikProjectManager.getInstance(Utils.getCurrentProject()); } void reset() { initProjectOfSettings(); - setLogin(StepikConnectorLogin.getCurrentUsername()); - setPasswordFieldText(DEFAULT_PASSWORD_TEXT); - resetCredentialsModification(); + resetModification(); + updateUserName(); } void apply() { - if (credentialsModified) { - initProjectOfSettings(); - - try { - String login = getEmail(); - String password = getPassword(); - - ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - StepikConnectorLogin.authenticate(login, password); - return null; - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - } catch (StepikUnauthorizedException e) { - showWarningDialog(WRONG_LOGIN_PASSWORD, CHECK_CREDENTIALS); - } catch (StepikClientException e) { - showWarningDialog(FAILED_CONNECTION, CHECK_CREDENTIALS); - } - } - if (hintCheckBoxModified && projectManager != null) { projectManager.setShowHint(hintCheckBox.isSelected()); } - resetCredentialsModification(); + resetModification(); } boolean isModified() { - return credentialsModified || hintCheckBoxModified; + return hintCheckBoxModified; } - private void resetCredentialsModification() { - credentialsModified = false; + private void resetModification() { hintCheckBoxModified = false; } - - private void createUIComponents() { - Document doc = new PlainDocument(); - passwordField = new JPasswordField(doc, null, 0); - } } From 99812417c559e2c94d3b0d7c70f5c1de539226b6 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 17:15:29 +0700 Subject: [PATCH 27/55] A "implicit grant" url is constant --- .../learning/stepik/StepikConnectorLogin.java | 16 ++++------------ .../org/stepik/plugin/auth/ui/AuthDialog.java | 2 +- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index 334b72b8..fb66ad74 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -18,25 +18,21 @@ import org.stepik.core.metrics.Metrics; import org.stepik.plugin.auth.ui.AuthDialog; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.util.Map; -import static java.nio.charset.StandardCharsets.UTF_8; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; public class StepikConnectorLogin { private static final Logger logger = Logger.getInstance(StepikConnectorLogin.class); private static final String CLIENT_ID = "vV8giW7KTPMOTriOUBwyGLvXbKV0Cc4GPBnyCJPd"; - private static final String REDIRECT_URI = "https://stepik.org"; + private static final String REDIRECT_URI = "https%3A%2F%2Fstepik.org"; private static final String LAST_USER_PROPERTY_NAME = PLUGIN_ID + ".LAST_USER"; private static final StepikApiClient stepikApiClient = initStepikApiClient(); - private static final String IMPLICIT_GRANT_URL_TEMPLATE = "https://stepik.org/oauth2/authorize/" + + private static final String IMPLICIT_GRANT_URL = "https://stepik.org/oauth2/authorize/" + "?client_id=" + CLIENT_ID + - "&redirect_uri=%s" + + "&redirect_uri=" + REDIRECT_URI + "&scope=write" + - "&state=%s" + "&response_type=token"; private static long getLastUser() { @@ -215,11 +211,7 @@ public static synchronized void logout() { @Nullable public static String getImplicitGrantUrl() { - try { - return String.format(IMPLICIT_GRANT_URL_TEMPLATE, URLEncoder.encode(REDIRECT_URI, UTF_8.name()), "1234"); - } catch (UnsupportedEncodingException e) { - return null; - } + return IMPLICIT_GRANT_URL; } public static void logoutAndAuth() { diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 8426bdce..4b1e5ec2 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -159,7 +159,7 @@ public void changed( Arrays.stream(params).forEach(param -> { String[] entry = param.split("="); String value = ""; - if (entry.length > 0) { + if (entry.length > 1) { value = entry[1]; } map.put(entry[0], value); From 4b27480b329ba982f0c88ce8cee6e5c905126a34 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 19 Mar 2017 02:37:38 +0700 Subject: [PATCH 28/55] Removed unused progress bar from browser --- .../tmp/learning/ui/StudyBrowserWindow.java | 52 ++----------------- .../learning/ui/StudyJavaFxToolWindow.java | 2 +- 2 files changed, 5 insertions(+), 49 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java index 11f77120..c022a1ad 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java @@ -25,7 +25,6 @@ import javafx.concurrent.Worker; import javafx.embed.swing.JFXPanel; import javafx.scene.Scene; -import javafx.scene.control.ProgressBar; import javafx.scene.layout.StackPane; import javafx.scene.web.WebEngine; import javafx.scene.web.WebHistory; @@ -65,16 +64,10 @@ class StudyBrowserWindow extends JFrame { private JFXPanel panel; private WebView webComponent; private StackPane pane; - private WebEngine engine; - private ProgressBar progressBar; - private boolean linkInNewBrowser = true; - private boolean showProgress = false; - StudyBrowserWindow(@NotNull Project project, final boolean linkInNewWindow, final boolean showProgress) { + StudyBrowserWindow(@NotNull Project project) { this.project = project; - linkInNewBrowser = linkInNewWindow; - this.showProgress = showProgress; setSize(new Dimension(900, 800)); setLayout(new BorderLayout()); setPanel(new JFXPanel()); @@ -117,17 +110,8 @@ private void initComponents() { pane = new StackPane(); webComponent = new WebView(); engine = webComponent.getEngine(); - - if (showProgress) { - progressBar = makeProgressBarWithListener(); - webComponent.setVisible(false); - pane.getChildren().addAll(webComponent, progressBar); - } else { - pane.getChildren().add(webComponent); - } - if (linkInNewBrowser) { - initHyperlinkListener(); - } + pane.getChildren().add(webComponent); + initHyperlinkListener(); Scene scene = new Scene(pane); panel.setScene(scene); panel.setVisible(true); @@ -140,10 +124,7 @@ private void initComponents() { void loadContent(@NotNull final String content) { String withCodeHighlighting = createHtmlWithCodeHighlighting(content); - Platform.runLater(() -> { - updateLookWithProgressBarIfNeeded(); - engine.loadContent(withCodeHighlighting); - }); + Platform.runLater(() -> engine.loadContent(withCodeHighlighting)); } @Nullable @@ -168,13 +149,6 @@ private String getExternalURL(@NotNull String internalPath) { return getClass().getResource(internalPath).toExternalForm(); } - private void updateLookWithProgressBarIfNeeded() { - if (showProgress) { - progressBar.setVisible(true); - webComponent.setVisible(false); - } - } - private void initHyperlinkListener() { engine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> { if (newState == Worker.State.SUCCEEDED) { @@ -382,24 +356,6 @@ public void mouseClicked(MouseEvent e) { return button; } - - private ProgressBar makeProgressBarWithListener() { - final ProgressBar progress = new ProgressBar(); - progress.progressProperty().bind(webComponent.getEngine().getLoadWorker().progressProperty()); - - webComponent.getEngine().getLoadWorker().stateProperty().addListener( - (ov, oldState, newState) -> { - if (webComponent.getEngine() - .getLocation() - .contains("http") && newState == Worker.State.SUCCEEDED) { - progressBar.setVisible(false); - webComponent.setVisible(true); - } - }); - - return progress; - } - JFXPanel getPanel() { return panel; } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java index 0761d827..4cb36c5f 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java @@ -29,7 +29,7 @@ public class StudyJavaFxToolWindow extends StudyToolWindow { @Override public JComponent createStepInfoPanel(Project project) { - browserWindow = new StudyBrowserWindow(project, true, false); + browserWindow = new StudyBrowserWindow(project); browserWindow.addBackAndOpenButtons(); JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); From f21fe404cd2cc6f28122a7764c037b834766fd6f Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 19 Mar 2017 02:44:01 +0700 Subject: [PATCH 29/55] Removed unused buttons from browser --- .../tmp/learning/ui/StudyBrowserWindow.java | 54 ------------------- .../learning/ui/StudyJavaFxToolWindow.java | 1 - 2 files changed, 55 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java index c022a1ad..7a8976e0 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java @@ -1,6 +1,5 @@ package com.jetbrains.tmp.learning.ui; -import com.intellij.icons.AllIcons; import com.intellij.ide.BrowserUtil; import com.intellij.ide.ui.LafManager; import com.intellij.ide.ui.LafManagerListener; @@ -27,7 +26,6 @@ import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.scene.web.WebEngine; -import javafx.scene.web.WebHistory; import javafx.scene.web.WebView; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -47,8 +45,6 @@ import javax.swing.*; import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -306,56 +302,6 @@ private String getLinkFromNodeWithCodeTag(@NotNull Element element) { }; } - void addBackAndOpenButtons() { - ApplicationManager.getApplication().invokeLater(() -> { - final JPanel panel = new JPanel(); - panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); - - final JButton backButton = makeGoButton("Click to go back", AllIcons.Actions.Back, -1); - final JButton forwardButton = makeGoButton("Click to go forward", AllIcons.Actions.Forward, 1); - final JButton openInBrowser = new JButton(AllIcons.Actions.Browser_externalJavaDoc); - openInBrowser.addActionListener(e -> BrowserUtil.browse(engine.getLocation())); - openInBrowser.setToolTipText("Click to open link in browser"); - addButtonsAvailabilityListeners(backButton, forwardButton); - - panel.setMaximumSize(new Dimension(40, getPanel().getHeight())); - panel.add(backButton); - panel.add(forwardButton); - panel.add(openInBrowser); - - add(panel, BorderLayout.PAGE_START); - }); - } - - private void addButtonsAvailabilityListeners(JButton backButton, JButton forwardButton) { - Platform.runLater(() -> engine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> { - if (newState == Worker.State.SUCCEEDED) { - final WebHistory history = engine.getHistory(); - boolean isGoBackAvailable = history.getCurrentIndex() > 0; - boolean isGoForwardAvailable = history.getCurrentIndex() < history.getEntries().size() - 1; - ApplicationManager.getApplication().invokeLater(() -> { - backButton.setEnabled(isGoBackAvailable); - forwardButton.setEnabled(isGoForwardAvailable); - }); - } - })); - } - - private JButton makeGoButton(@NotNull final String toolTipText, @NotNull final Icon icon, final int direction) { - final JButton button = new JButton(icon); - button.setEnabled(false); - button.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 1) { - Platform.runLater(() -> engine.getHistory().go(direction)); - } - } - }); - button.setToolTipText(toolTipText); - return button; - } - JFXPanel getPanel() { return panel; } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java index 4cb36c5f..005fae1f 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java @@ -30,7 +30,6 @@ public class StudyJavaFxToolWindow extends StudyToolWindow { @Override public JComponent createStepInfoPanel(Project project) { browserWindow = new StudyBrowserWindow(project); - browserWindow.addBackAndOpenButtons(); JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); panel.add(browserWindow.getPanel()); From 5522c6bb574d7f7eec1cbfb38b04c83aec3ca4d2 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 19 Mar 2017 04:40:34 +0700 Subject: [PATCH 30/55] Now the StepikProjectManager manage selected step --- .../tmp/learning/StepikProjectManager.java | 57 ++++++++++++++- .../learning/StudyBasePluginConfigurator.java | 28 ++++---- .../tmp/learning/StudyPluginConfigurator.java | 5 +- .../tmp/learning/StudyProjectComponent.java | 6 +- .../jetbrains/tmp/learning/StudyUtils.java | 50 -------------- .../tmp/learning/ui/FormListener.java | 4 +- .../learning/ui/StudyJavaFxToolWindow.java | 43 ------------ .../tmp/learning/ui/StudySwingToolWindow.java | 69 ------------------- .../tmp/learning/ui/StudyToolWindow.java | 25 ++++--- .../learning/ui/StudyToolWindowFactory.java | 4 +- .../org/stepik/plugin/actions/SendAction.java | 4 +- .../stepik/plugin/utils/NavigationUtils.java | 5 +- .../main/resources/templates/quiz/dataset.ftl | 7 +- .../actions/step/AbstractStepAction.java | 17 ++--- .../actions/step/DownloadSubmission.java | 8 ++- .../actions/step/InsertStepikDirectives.java | 20 +++++- .../actions/step/StepikJavaPostAction.java | 11 +-- .../actions/step/StepikResetStepAction.java | 23 +++++-- .../projectView/StepikDirectoryNode.java | 3 +- 19 files changed, 152 insertions(+), 237 deletions(-) delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/ui/StudySwingToolWindow.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java b/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java index 1f3314ee..86f68f52 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java @@ -27,6 +27,7 @@ import com.jetbrains.tmp.learning.serialization.StudySerializationUtils; import com.jetbrains.tmp.learning.serialization.StudyUnrecognizedFormatException; import com.jetbrains.tmp.learning.serialization.SupportedLanguagesConverter; +import com.jetbrains.tmp.learning.ui.StudyToolWindow; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.XStreamException; import com.thoughtworks.xstream.annotations.XStreamOmitField; @@ -59,8 +60,8 @@ import java.util.UUID; import static com.jetbrains.tmp.learning.SupportedLanguages.INVALID; -import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; @State(name = "StepikStudySettings", storages = @Storage("stepik_study_project.xml")) public class StepikProjectManager implements PersistentStateComponent, DumbAware { @@ -79,6 +80,7 @@ public class StepikProjectManager implements PersistentStateComponent, @XStreamOmitField private final Project project; private StudyNode root; + private StudyNode selected; private boolean showHint = false; private long createdBy; private SupportedLanguages defaultLang = INVALID; @@ -176,6 +178,59 @@ private static Element toElement(ByteArrayOutputStream out) } } + public static void setSelected(@NotNull Project project, @Nullable StudyNode studyNode, boolean force) { + StepikProjectManager instance = getInstance(project); + if (instance != null) { + instance.setSelected(studyNode, force); + } + } + + public static void setSelected(@NotNull Project project, @Nullable StudyNode studyNode) { + setSelected(project, studyNode, false); + } + + public static void updateSelection(@NotNull Project project) { + StepikProjectManager instance = getInstance(project); + if (instance != null) { + instance.updateSelection(); + } + } + + @Nullable + public static StudyNode getSelected(@Nullable Project project) { + if (project == null) { + return null; + } + StepikProjectManager instance = getInstance(project); + if (instance != null) { + return instance.getSelected(); + } + + return null; + } + + public StudyNode getSelected() { + return selected; + } + + public void setSelected(StudyNode selected) { + setSelected(selected, false); + } + + public void setSelected(StudyNode selected, boolean force) { + this.selected = selected; + if (project != null) { + StudyToolWindow toolWindow = StudyUtils.getStudyToolWindow(project); + if (toolWindow != null) { + ApplicationManager.getApplication().invokeLater(() -> toolWindow.setStepNode(selected, force)); + } + } + } + + public void updateSelection() { + setSelected(selected, true); + } + public void setRootNode(@Nullable StudyNode root) { this.root = root; } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java b/core/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java index bfef8789..1aecaa7f 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java @@ -1,13 +1,12 @@ package com.jetbrains.tmp.learning; import com.intellij.openapi.actionSystem.DefaultActionGroup; -import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.FileEditorManagerAdapter; import com.intellij.openapi.fileEditor.FileEditorManagerEvent; import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.ui.StudyToolWindow; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -34,23 +33,20 @@ public Map getAdditionalPanels(Project project) { @NotNull @Override - public FileEditorManagerListener getFileEditorManagerListener( - @NotNull Project project, - @NotNull StudyToolWindow toolWindow) { - - return new FileEditorManagerListener() { + public FileEditorManagerListener getFileEditorManagerListener(@NotNull Project project) { + return new FileEditorManagerAdapter() { @Override - public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - } + public void selectionChanged(@NotNull FileEditorManagerEvent event) { + VirtualFile file = event.getNewFile(); + if (file == null) { + return; + } - @Override - public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - } + StudyNode stepNode = StudyUtils.getStudyNode(project, file); - @Override - public void selectionChanged(@NotNull FileEditorManagerEvent event) { - StudyNode stepNode = StudyUtils.getSelectedNode(event.getManager().getProject()); - toolWindow.setStepNode(stepNode); + if (stepNode != null) { + StepikProjectManager.setSelected(project, stepNode); + } } }; } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java b/core/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java index 5bbf9372..96895439 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java @@ -4,7 +4,6 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.ui.StudyToolWindow; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -28,9 +27,7 @@ public interface StudyPluginConfigurator { Map getAdditionalPanels(Project project); @NotNull - FileEditorManagerListener getFileEditorManagerListener( - @NotNull final Project project, - @NotNull final StudyToolWindow toolWindow); + FileEditorManagerListener getFileEditorManagerListener(@NotNull final Project project); boolean accept(@NotNull final Project project); } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java b/core/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java index a05ba026..2e603efd 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java @@ -51,10 +51,8 @@ public void projectOpened() { if (!StepikProjectManager.isStepikProject(project)) { return; } - // Check if user has javafx lib in his JDK. Now bundled JDK doesn't have this lib inside. - if (StudyUtils.hasJavaFx()) { - Platform.setImplicitExit(false); - } + + Platform.setImplicitExit(false); registerStudyToolWindow(); ApplicationManager.getApplication().invokeLater( diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java index 49470019..17d96338 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java @@ -5,8 +5,6 @@ import com.intellij.ide.projectView.impl.AbstractProjectViewPane; import com.intellij.ide.ui.LafManager; import com.intellij.ide.ui.laf.darcula.DarculaLookAndFeelInfo; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindow; @@ -59,11 +57,6 @@ public class StudyUtils { private StudyUtils() { } - public static void updateToolWindows(@NotNull final Project project) { - StudyNode stepNode = getSelectedNode(project); - setStudyNode(project, stepNode, true); - } - static void initToolWindows(@NotNull final Project project) { final ToolWindowManager windowManager = ToolWindowManager.getInstance(project); windowManager.getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW) @@ -89,17 +82,6 @@ static StudyToolWindow getStudyToolWindow(@NotNull final Project project) { return null; } - public static void setStudyNode(@NotNull final Project project, @Nullable StudyNode studyNode) { - setStudyNode(project, studyNode, false); - } - - public static void setStudyNode(@NotNull final Project project, @Nullable StudyNode studyNode, boolean force) { - StudyToolWindow toolWindow = getStudyToolWindow(project); - if (toolWindow != null) { - ApplicationManager.getApplication().invokeLater(() -> toolWindow.setStepNode(studyNode, force)); - } - } - @NotNull public static String getVideoStepText( @NotNull VideoStepNodeHelper videoStepNode, @@ -268,29 +250,6 @@ private static String getRelativePath(@NotNull Project project, @NotNull Virtual return ProjectFilesUtils.getRelativePath(basePath, path); } - @Nullable - public static StepNode getSelectedStep(@NotNull Project project) { - VirtualFile[] files = FileEditorManager.getInstance(project).getSelectedFiles(); - if (files.length == 0) { - return null; - } - - StudyNode studyNode = getStudyNode(project, files[0]); - - return studyNode instanceof StepNode ? (StepNode) studyNode : null; - } - - @Nullable - static StudyNode getSelectedNode(@NotNull Project project) { - StudyNode studyNode = getSelectedStep(project); - - if (studyNode == null) { - studyNode = getSelectedNodeInTree(project); - } - - return studyNode; - } - @Nullable public static StudyNode getSelectedNodeInTree(@NotNull Project project) { PsiElement element = getSelectedPsiElement(project); @@ -340,15 +299,6 @@ private static PsiElement getSelectedPsiElement(@NotNull Project project) { } } - public static boolean hasJavaFx() { - try { - Class.forName("javafx.application.Platform"); - return true; - } catch (ClassNotFoundException e) { - return false; - } - } - @Nullable public static StudyNode getStudyNode(@NotNull Project project, @NotNull VirtualFile nodeVF) { String path = getRelativePath(project, nodeVF); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java index f5bd87b5..b0768ba1 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java @@ -83,7 +83,7 @@ public void handleEvent(Event event) { boolean locked = elements.isLocked(); if (!locked) { getAttempt(stepNode); - StudyUtils.setStudyNode(project, node, true); + StepikProjectManager.updateSelection(project); } break; case "active": @@ -210,7 +210,7 @@ public void run(@NotNull ProgressIndicator indicator) { } } catch (StepikClientException e) { logger.warn("Failed send step from browser", e); - StudyUtils.updateToolWindows(project); + StepikProjectManager.updateSelection(project); } } }); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java deleted file mode 100644 index 005fae1f..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyJavaFxToolWindow.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.jetbrains.tmp.learning.ui; - -import com.intellij.openapi.project.Project; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; - -public class StudyJavaFxToolWindow extends StudyToolWindow { - private StudyBrowserWindow browserWindow; - - StudyJavaFxToolWindow() { - super(); - } - - @Override - public JComponent createStepInfoPanel(Project project) { - browserWindow = new StudyBrowserWindow(project); - JPanel panel = new JPanel(); - panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); - panel.add(browserWindow.getPanel()); - return panel; - } - - @Override - public void setText(@NotNull String text) { - browserWindow.loadContent(text); - } -} diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudySwingToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudySwingToolWindow.java deleted file mode 100644 index 0e82d45f..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudySwingToolWindow.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2000-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.jetbrains.tmp.learning.ui; - -import com.intellij.openapi.editor.colors.EditorColorsManager; -import com.intellij.openapi.editor.colors.EditorColorsScheme; -import com.intellij.openapi.project.Project; -import com.intellij.ui.BrowserHyperlinkListener; -import com.intellij.ui.ColorUtil; -import com.intellij.ui.components.JBScrollPane; -import com.intellij.util.ui.UIUtil; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.text.html.HTMLDocument; -import javax.swing.text.html.HTMLEditorKit; -import java.awt.*; - -public class StudySwingToolWindow extends StudyToolWindow { - private JTextPane stepTextPane; - - StudySwingToolWindow() { - super(); - } - - @Override - public JComponent createStepInfoPanel(Project project) { - stepTextPane = new JTextPane(); - final JBScrollPane scrollPane = new JBScrollPane(stepTextPane); - stepTextPane.setContentType(new HTMLEditorKit().getContentType()); - final EditorColorsScheme editorColorsScheme = EditorColorsManager.getInstance().getGlobalScheme(); - int fontSize = editorColorsScheme.getEditorFontSize(); - final String fontName = editorColorsScheme.getEditorFontName(); - final Font font = new Font(fontName, Font.PLAIN, fontSize); - String bodyRule = "body { font-family: " + font.getFamily() + "; " + - "font-size: " + font.getSize() + "pt; }" + - "pre {font-family: Courier; display: inline; ine-height: 50px; padding-top: 5px; padding-bottom: 5px; padding-left: 5px; background-color:" - + ColorUtil.toHex(ColorUtil.dimmer(UIUtil.getPanelBackground())) + ";}" + - "code {font-family: Courier; display: flex; float: left; background-color:" - + ColorUtil.toHex(ColorUtil.dimmer(UIUtil.getPanelBackground())) + ";}"; - ((HTMLDocument) stepTextPane.getDocument()).getStyleSheet().addRule(bodyRule); - stepTextPane.setEditable(false); - if (!UIUtil.isUnderDarcula()) { - stepTextPane.setBackground(EditorColorsManager.getInstance().getGlobalScheme().getDefaultBackground()); - } - stepTextPane.setBorder(new EmptyBorder(20, 20, 0, 10)); - stepTextPane.addHyperlinkListener(BrowserHyperlinkListener.INSTANCE); - return scrollPane; - } - - public void setText(@NotNull String text) { - stepTextPane.setText(text); - } -} - diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java index a3d1dafd..b75e6729 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java @@ -57,7 +57,7 @@ import static com.jetbrains.tmp.learning.courseFormat.StepType.VIDEO; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; -public abstract class StudyToolWindow extends SimpleToolWindowPanel implements DataProvider, Disposable, ActionListener { +public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvider, Disposable, ActionListener { private static final Logger logger = Logger.getInstance(StudyToolWindow.class); private static final String STEP_INFO_ID = "stepInfo"; private static final String EMPTY_STEP_TEXT = "Please, open any step to see step description"; @@ -73,6 +73,7 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D private final ActionListener qualityListener; private Project project; private StepNode stepNode; + private StudyBrowserWindow browserWindow; StudyToolWindow() { super(true, true); @@ -109,6 +110,18 @@ private static DefaultActionGroup getActionGroup(@NotNull final Project project) } } + private JComponent createStepInfoPanel(Project project) { + browserWindow = new StudyBrowserWindow(project); + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); + panel.add(browserWindow.getPanel()); + return panel; + } + + private void setText(@NotNull String text) { + browserWindow.loadContent(text); + } + private JPanel createToolbarPanel(ActionGroup group) { final ActionToolbar actionToolBar = ActionManager.getInstance().createActionToolbar("Study", group, true); BorderLayoutPanel toolBar = JBUI.Panels.simplePanel(actionToolBar.getComponent()); @@ -135,7 +148,7 @@ void init(@NotNull final Project project) { StudyPluginConfigurator configurator = StudyUtils.getConfigurator(project); if (configurator != null) { - final FileEditorManagerListener listener = configurator.getFileEditorManagerListener(project, this); + final FileEditorManagerListener listener = configurator.getFileEditorManagerListener(project); project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener); } @@ -143,7 +156,7 @@ void init(@NotNull final Project project) { videoQualityBox.addItem(loadVideoQuality()); videoQualityBox.setSelectedIndex(0); - StepNode stepNode = StudyUtils.getSelectedStep(project); + StudyNode stepNode = StepikProjectManager.getSelected(project); setStepNode(stepNode); } @@ -166,9 +179,7 @@ public void dispose() { setStepNode(null); } - public abstract JComponent createStepInfoPanel(Project project); - - public void setStepNode(@Nullable StudyNode studyNode) { + private void setStepNode(@Nullable StudyNode studyNode) { setStepNode(studyNode, false); } @@ -301,8 +312,6 @@ private void storeVideoQuality(int quality) { PropertiesComponent.getInstance().setValue(VIDEO_QUALITY_PROPERTY_NAME, String.valueOf(quality)); } - protected abstract void setText(@NotNull String text); - @Override public void actionPerformed(ActionEvent e) { if (stepNode == null) { diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java index 569d175d..eb8e6a0e 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java @@ -9,7 +9,6 @@ import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManager; import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyUtils; import icons.AllStepikIcons; import org.jetbrains.annotations.NotNull; @@ -26,8 +25,7 @@ public void createToolWindowContent(@NotNull final Project project, @NotNull fin return; } - final StudyToolWindow studyToolWindow; - studyToolWindow = StudyUtils.hasJavaFx() ? new StudyJavaFxToolWindow() : new StudySwingToolWindow(); + final StudyToolWindow studyToolWindow = new StudyToolWindow(); studyToolWindow.init(project); final ContentManager contentManager = toolWindow.getContentManager(); final Content content = contentManager.getFactory().createContent(studyToolWindow, null, false); diff --git a/core/src/main/java/org/stepik/plugin/actions/SendAction.java b/core/src/main/java/org/stepik/plugin/actions/SendAction.java index 0d42746c..9ab52df0 100644 --- a/core/src/main/java/org/stepik/plugin/actions/SendAction.java +++ b/core/src/main/java/org/stepik/plugin/actions/SendAction.java @@ -6,7 +6,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.StudyUtils; +import com.jetbrains.tmp.learning.StepikProjectManager; import com.jetbrains.tmp.learning.courseFormat.StepNode; import com.jetbrains.tmp.learning.courseFormat.StudyStatus; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; @@ -89,7 +89,7 @@ public static void checkStepStatus( notify(project, stepNode, stepStatus, hint); ApplicationManager.getApplication().invokeLater(() -> { ProjectView.getInstance(project).refresh(); - StudyUtils.updateToolWindows(project); + StepikProjectManager.updateSelection(project); }); logger.info(String.format("Finish check a status for step: %s with status: %s", stepIdString, stepStatus)); } diff --git a/core/src/main/java/org/stepik/plugin/utils/NavigationUtils.java b/core/src/main/java/org/stepik/plugin/utils/NavigationUtils.java index 88ac5cbc..a6d8a8a0 100644 --- a/core/src/main/java/org/stepik/plugin/utils/NavigationUtils.java +++ b/core/src/main/java/org/stepik/plugin/utils/NavigationUtils.java @@ -12,7 +12,7 @@ import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.PsiManager; import com.intellij.util.ui.tree.TreeUtil; -import com.jetbrains.tmp.learning.StudyUtils; +import com.jetbrains.tmp.learning.StepikProjectManager; import com.jetbrains.tmp.learning.courseFormat.StepNode; import com.jetbrains.tmp.learning.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; @@ -68,8 +68,7 @@ public static void navigate(@NotNull Project project, StudyNode targetNode) { updateProjectView(project, mainFile); } Metrics.navigateAction(project, targetNode, SUCCESSFUL); - - StudyUtils.setStudyNode(project, targetNode); + StepikProjectManager.setSelected(project, targetNode); ToolWindow runToolWindow = ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.RUN); if (runToolWindow != null) { diff --git a/core/src/main/resources/templates/quiz/dataset.ftl b/core/src/main/resources/templates/quiz/dataset.ftl index 8a872033..127ee5a8 100644 --- a/core/src/main/resources/templates/quiz/dataset.ftl +++ b/core/src/main/resources/templates/quiz/dataset.ftl @@ -60,11 +60,10 @@ var active = false; - if (time_left > 0) { - clock.innerHTML = timeToString(time_left); - } - if (active) { + if (time_left > 0) { + clock.innerHTML = timeToString(time_left); + } var timerId = setInterval(function () { time_left--; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/AbstractStepAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/AbstractStepAction.java index 655e36c6..4d845eae 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/AbstractStepAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/AbstractStepAction.java @@ -1,11 +1,10 @@ package org.stepik.plugin.actions.step; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.Presentation; -import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.StudyUtils; +import com.jetbrains.tmp.learning.StepikProjectManager; import com.jetbrains.tmp.learning.actions.StudyActionWithShortcut; import com.jetbrains.tmp.learning.courseFormat.StepNode; +import com.jetbrains.tmp.learning.courseFormat.StudyNode; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -20,15 +19,7 @@ abstract class AbstractStepAction extends StudyActionWithShortcut { @Override public void update(AnActionEvent e) { - final Presentation presentation = e.getPresentation(); - presentation.setEnabled(false); - - Project project = e.getProject(); - if (project == null) { - return; - } - - StepNode targetStepNode = StudyUtils.getSelectedStep(project); - presentation.setEnabled(targetStepNode != null && !targetStepNode.getWasDeleted()); + StudyNode targetStepNode = StepikProjectManager.getSelected(e.getProject()); + e.getPresentation().setEnabled((targetStepNode instanceof StepNode) && !targetStepNode.getWasDeleted()); } } diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/DownloadSubmission.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/DownloadSubmission.java index 69a55453..25ead86c 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/DownloadSubmission.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/DownloadSubmission.java @@ -20,7 +20,7 @@ import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.StudyUtils; +import com.jetbrains.tmp.learning.StepikProjectManager; import com.jetbrains.tmp.learning.SupportedLanguages; import com.jetbrains.tmp.learning.courseFormat.StepNode; import com.jetbrains.tmp.learning.courseFormat.StudyNode; @@ -90,11 +90,13 @@ private void downloadSubmission(@Nullable Project project) { return; } - StepNode stepNode = StudyUtils.getSelectedStep(project); - if (stepNode == null) { + StudyNode studyNode = StepikProjectManager.getSelected(project); + if (!(studyNode instanceof StepNode)) { return; } + StepNode stepNode = (StepNode) studyNode; + String title = "Download submission"; List submissions = ProgressManager.getInstance() diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/InsertStepikDirectives.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/InsertStepikDirectives.java index f702c998..87d17dd4 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/InsertStepikDirectives.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/InsertStepikDirectives.java @@ -3,6 +3,7 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.KeyboardShortcut; +import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; @@ -11,9 +12,9 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyUtils; import com.jetbrains.tmp.learning.SupportedLanguages; import com.jetbrains.tmp.learning.courseFormat.StepNode; +import com.jetbrains.tmp.learning.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.core.metrics.Metrics; @@ -22,6 +23,7 @@ import javax.swing.*; +import static com.jetbrains.tmp.learning.courseFormat.StepType.CODE; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; import static org.stepik.plugin.utils.DirectivesUtils.insertAmbientCode; @@ -59,11 +61,13 @@ public void actionPerformed(AnActionEvent e) { return; } - StepNode targetStepNode = StudyUtils.getSelectedStep(project); - if (targetStepNode == null) { + StudyNode selectedNode = StepikProjectManager.getSelected(project); + if (!(selectedNode instanceof StepNode) || ((StepNode) selectedNode).getType() != CODE) { return; } + StepNode targetStepNode = (StepNode) selectedNode; + FileDocumentManager documentManager = FileDocumentManager.getInstance(); for (VirtualFile file : FileEditorManager.getInstance(project).getOpenFiles()) { Document document = documentManager.getDocument(file); @@ -105,4 +109,14 @@ public void actionPerformed(AnActionEvent e) { } } } + + @Override + public void update(AnActionEvent e) { + super.update(e); + Presentation presentation = e.getPresentation(); + StudyNode selectedNode = StepikProjectManager.getSelected(e.getProject()); + boolean enabled = presentation.isEnabled(); + boolean canEnabled = (selectedNode instanceof StepNode) && (((StepNode) selectedNode).getType() == CODE); + presentation.setEnabled(enabled && canEnabled); + } } diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikJavaPostAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikJavaPostAction.java index 1c2c94ca..c157f58e 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikJavaPostAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikJavaPostAction.java @@ -6,9 +6,10 @@ import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.StudyUtils; +import com.jetbrains.tmp.learning.StepikProjectManager; import com.jetbrains.tmp.learning.SupportedLanguages; import com.jetbrains.tmp.learning.courseFormat.StepNode; +import com.jetbrains.tmp.learning.courseFormat.StudyNode; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -160,12 +161,14 @@ private static void notifyFailed( @Override public void check(@NotNull Project project) { logger.info("Start checking step"); - StepNode stepNode = StudyUtils.getSelectedStep(project); - if (stepNode == null) { - logger.info("Stop checking step: step is null"); + StudyNode selected = StepikProjectManager.getSelected(project); + if (!(selected instanceof StepNode)) { + logger.info("Stop checking step: step is null or is not StepNode "); return; } + StepNode stepNode = (StepNode) selected; + String title = "Checking Step: " + stepNode.getName(); ProgressManager.getInstance().run(new Task.Backgroundable(project, title) { diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikResetStepAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikResetStepAction.java index df55531b..311d317d 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikResetStepAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikResetStepAction.java @@ -3,6 +3,7 @@ import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.KeyboardShortcut; +import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Document; @@ -11,8 +12,9 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.problems.WolfTheProblemSolver; -import com.jetbrains.tmp.learning.StudyUtils; +import com.jetbrains.tmp.learning.StepikProjectManager; import com.jetbrains.tmp.learning.courseFormat.StepNode; +import com.jetbrains.tmp.learning.courseFormat.StudyNode; import icons.AllStepikIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -21,6 +23,7 @@ import javax.swing.*; +import static com.jetbrains.tmp.learning.courseFormat.StepType.CODE; import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; public class StepikResetStepAction extends AbstractStepAction { @@ -39,11 +42,13 @@ private static void reset(@NotNull final Project project) { } private static void resetFile(@NotNull final Project project) { - StepNode stepNode = StudyUtils.getSelectedStep(project); - if (stepNode == null) { + StudyNode selected = StepikProjectManager.getSelected(project); + if (!(selected instanceof StepNode) || ((StepNode) selected).getType() != CODE) { return; } + StepNode stepNode = (StepNode) selected; + VirtualFile src = getOrCreateSrcDirectory(project, stepNode, true); if (src == null) { return; @@ -58,7 +63,7 @@ private static void resetFile(@NotNull final Project project) { if (document != null) { resetDocument(project, document, stepNode); ProjectView.getInstance(project).refresh(); - StudyUtils.updateToolWindows(project); + StepikProjectManager.updateSelection(project); WolfTheProblemSolver.getInstance(project).clearProblems(mainFile); } } @@ -99,4 +104,14 @@ public String getActionId() { public String[] getShortcuts() { return new String[]{SHORTCUT}; } + + @Override + public void update(AnActionEvent e) { + super.update(e); + Presentation presentation = e.getPresentation(); + StudyNode selectedNode = StepikProjectManager.getSelected(e.getProject()); + boolean enabled = presentation.isEnabled(); + boolean canEnabled = (selectedNode instanceof StepNode) && (((StepNode) selectedNode).getType() == CODE); + presentation.setEnabled(enabled && canEnabled); + } } diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikDirectoryNode.java b/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikDirectoryNode.java index 1b12c90b..40ecb559 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikDirectoryNode.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikDirectoryNode.java @@ -6,6 +6,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; +import com.jetbrains.tmp.learning.StepikProjectManager; import com.jetbrains.tmp.learning.StudyUtils; import com.jetbrains.tmp.learning.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; @@ -69,7 +70,7 @@ public void navigate(boolean requestFocus) { StudyNode studyNode; if (virtualFile != null) { studyNode = StudyUtils.getStudyNode(myProject, virtualFile); - StudyUtils.setStudyNode(myProject, studyNode); + StepikProjectManager.setSelected(myProject, studyNode); } } } From 5a6165f5f6c08d554bcfe85d4c10be3e65a0172d Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 19 Mar 2017 05:02:36 +0700 Subject: [PATCH 31/55] Corrected step navigation --- .../java/com/jetbrains/tmp/learning/courseFormat/Node.java | 2 +- .../plugin/actions/navigation/StepikStepNavigationAction.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java index bc70c584..5351b5b2 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java @@ -47,7 +47,7 @@ public abstract class Node< private StudyNode getLastNode() { List children = getChildren(); - for (int i = children.size() - 1; i > 0; i--) { + for (int i = children.size() - 1; i >= 0; i--) { C child = children.get(i); if (!child.getWasDeleted()) { return child; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikStepNavigationAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikStepNavigationAction.java index 64680ac3..59034274 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikStepNavigationAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikStepNavigationAction.java @@ -2,7 +2,6 @@ import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyUtils; import com.jetbrains.tmp.learning.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,7 +16,7 @@ abstract class StepikStepNavigationAction extends StudyStepNavigationAction { @Override public void navigateStep(@NotNull final Project project) { - StudyNode currentNode = StudyUtils.getSelectedNodeInTree(project); + StudyNode currentNode = StepikProjectManager.getSelected(project); if (currentNode == null) { currentNode = StepikProjectManager.getProjectRoot(project); } From 09a365361f4c090b2d69446752f9432ecabb3d29 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sat, 11 Mar 2017 22:18:39 +0700 Subject: [PATCH 32/55] Added auth dialog --- .../learning/stepik/StepikConnectorLogin.java | 43 +++++- .../org/stepik/plugin/auth/ui/AuthDialog.java | 128 ++++++++++++++++++ .../ui/ProjectSettingsPanel.java | 3 +- 3 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index e00fec55..a62eac71 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -16,15 +16,28 @@ import org.stepik.api.objects.auth.TokenInfo; import org.stepik.api.objects.users.User; import org.stepik.core.metrics.Metrics; +import org.stepik.plugin.auth.ui.AuthDialog; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; + +import static java.nio.charset.StandardCharsets.UTF_8; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; public class StepikConnectorLogin { private static final Logger logger = Logger.getInstance(StepikConnectorLogin.class); - private static final String CLIENT_ID = "hUCWcq3hZHCmz0DKrDtwOWITLcYutzot7p4n59vU"; + private static final String CLIENT_ID = "vV8giW7KTPMOTriOUBwyGLvXbKV0Cc4GPBnyCJPd"; + private static final String REDIRECT_URI = "https://stepik.org"; private static final String LAST_USER_PROPERTY_NAME = PLUGIN_ID + ".LAST_USER"; private static final StepikApiClient stepikApiClient = initStepikApiClient(); + private static final String IMPLICIT_GRANT_URL_TEMPLATE = "https://stepik.org/oauth2/authorize/" + + "?client_id=" + CLIENT_ID + + "&redirect_uri=%s" + + "&scope=write" + + "&state=%s" + + "&response_type=token"; private static long getLastUser() { return PropertiesComponent.getInstance().getOrInitLong(LAST_USER_PROPERTY_NAME, 0); @@ -68,15 +81,21 @@ private static StepikApiClient initStepikApiClient() { public static void authentication() { AuthInfo authInfo = getAuthInfo(getLastUser()); if (!minorLogin(authInfo)) { - showAuthDialog(); + showAuthDialog(false); } } - private static void showAuthDialog() { + private static void showAuthDialog(boolean clear) { ApplicationManager.getApplication().invokeAndWait(() -> { logger.info("Show the authentication dialog"); - final LoginDialog dialog = new LoginDialog(); - dialog.show(); + Map map = AuthDialog.showAuthForm(clear); + + TokenInfo tokenInfo = stepikApiClient.getTokenInfo(); + tokenInfo.setAccessToken(map.get("access_token")); + tokenInfo.setExpiresIn(Integer.valueOf(map.getOrDefault("expires_in", "0"))); + tokenInfo.setScope(map.get("scope")); + tokenInfo.setTokenType(map.get("token_type")); + tokenInfo.setRefreshToken(null); }, ModalityState.defaultModalityState()); } @@ -254,4 +273,18 @@ public static void logout() { logger.info("Logout successfully"); } } + + @Nullable + public static String getImplicitGrantUrl() { + try { + return String.format(IMPLICIT_GRANT_URL_TEMPLATE, URLEncoder.encode(REDIRECT_URI, UTF_8.name()), "1234"); + } catch (UnsupportedEncodingException e) { + return null; + } + } + + public static void logoutAndAuth() { + logout(); + showAuthDialog(true); + } } \ No newline at end of file diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java new file mode 100644 index 00000000..cdc3cb67 --- /dev/null +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -0,0 +1,128 @@ +package org.stepik.plugin.auth.ui; + +import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.concurrent.Worker; +import javafx.embed.swing.JFXPanel; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.ProgressBar; +import javafx.scene.layout.StackPane; +import javafx.scene.web.WebEngine; +import javafx.scene.web.WebView; +import org.stepik.api.urls.Urls; + +import javax.swing.*; +import java.awt.*; +import java.net.CookieHandler; +import java.net.CookieManager; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author meanmail + */ +public class AuthDialog extends JDialog { + private final Map map = new HashMap<>(); + private WebEngine engine; + private WebView webComponent; + private Node progressBar; + private JFXPanel panel; + + private AuthDialog(boolean clear) { + super((Frame) null, true); + setTitle("Authorize"); + setSize(new Dimension(640, 480)); + setLocationRelativeTo(null); + setLayout(new BorderLayout()); + setPanel(new JFXPanel()); + Platform.runLater(() -> { + StackPane pane = new StackPane(); + webComponent = new WebView(); + engine = webComponent.getEngine(); + progressBar = makeProgressBarWithListener(); + webComponent.setVisible(false); + pane.getChildren().addAll(webComponent, progressBar); + Scene scene = new Scene(pane); + panel.setScene(scene); + panel.setVisible(true); + + if (clear) { + CookieManager manager = new CookieManager(); + CookieHandler.setDefault(manager); + manager.getCookieStore().removeAll(); + } + String url = StepikConnectorLogin.getImplicitGrantUrl(); + engine.load(url); + }); + add(panel, BorderLayout.CENTER); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + } + + public static Map showAuthForm(boolean clear) { + AuthDialog instance = new AuthDialog(clear); + instance.setVisible(true); + return instance.map; + } + + private ProgressBar makeProgressBarWithListener() { + final ProgressBar progress = new ProgressBar(); + Worker loadWorker = engine.getLoadWorker(); + progress.progressProperty().bind(loadWorker.progressProperty()); + + loadWorker.stateProperty().addListener( + new ChangeListener() { + @Override + public void changed( + ObservableValue ov, + Worker.State oldState, + Worker.State newState) { + if (newState == Worker.State.CANCELLED) { + return; + } + String location = engine.getLocation(); + System.out.println(location); + if (location != null) { + if (location.startsWith(Urls.STEPIK_URL + "/#")) { + String paramString = location.split("#")[1]; + String[] params = paramString.split("&"); + map.clear(); + Arrays.stream(params).forEach(param -> { + String[] entry = param.split("="); + String value = ""; + if (entry.length > 0) { + value = entry[1]; + } + map.put(entry[0], value); + }); + hide(); + return; + } else if ((Urls.STEPIK_URL + "/?error=access_denied").equals(location)) { + hide(); + return; + } + } + + if (newState == Worker.State.SUCCEEDED) { + progressBar.setVisible(false); + webComponent.setVisible(true); + AuthDialog.this.setTitle(engine.getTitle()); + } + } + + private void hide() { + loadWorker.cancel(); + setVisible(false); + } + }); + + return progress; + } + + private void setPanel(JFXPanel panel) { + this.panel = panel; + } +} diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java index 9c3b8a04..4599271a 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java @@ -44,8 +44,7 @@ public ProjectSettingsPanel(@NotNull Project project, boolean visibleLangBox) { mainPanel.addHierarchyListener(this); logoutButton.addActionListener(e -> { - StepikConnectorLogin.logout(); - StepikConnectorLogin.authentication(); + StepikConnectorLogin.logoutAndAuth(); setUsername(); }); } From d512f5ecf0b59f092a74d159f2f130c208f94420 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sat, 11 Mar 2017 22:27:05 +0700 Subject: [PATCH 33/55] Removed login dialog --- .../tmp/learning/stepik/LoginDialog.java | 90 ------------------- .../jetbrains/tmp/learning/ui/LoginPanel.form | 59 ------------ .../jetbrains/tmp/learning/ui/LoginPanel.java | 66 -------------- .../org/stepik/plugin/auth/ui/AuthDialog.java | 2 +- 4 files changed, 1 insertion(+), 216 deletions(-) delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java deleted file mode 100644 index 614f6bf1..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/LoginDialog.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.jetbrains.tmp.learning.stepik; - -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.util.ThrowableComputable; -import com.intellij.openapi.util.text.StringUtil; -import com.jetbrains.tmp.learning.ui.LoginPanel; -import org.jetbrains.annotations.NotNull; -import org.stepik.api.exceptions.StepikClientException; -import org.stepik.api.exceptions.StepikUnauthorizedException; -import org.stepik.core.utils.Utils; - -import javax.swing.*; - -public class LoginDialog extends DialogWrapper { - private final LoginPanel loginPanel; - - LoginDialog() { - super(false); - loginPanel = new LoginPanel(this); - setTitle("Authentication at Stepik"); - setOKButtonText("Login"); - init(); - } - - @NotNull - protected Action[] createActions() { - return new Action[]{getOKAction(), getCancelAction()}; - } - - @Override - protected JComponent createCenterPanel() { - return loginPanel.getContentPanel(); - } - - @Override - protected String getHelpId() { - return "login_to_stepik"; - } - - @Override - public JComponent getPreferredFocusedComponent() { - return loginPanel.getPreferableFocusComponent(); - } - - @Override - protected void doOKAction() { - if (!validateLoginAndPasswordFields()) { - return; - } - - try { - String login = loginPanel.getLogin(); - String password = loginPanel.getPassword(); - - ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - StepikConnectorLogin.authenticate(login, password); - return null; - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - doJustOkAction(); - } catch (StepikUnauthorizedException e) { - setErrorText("Wrong a login or a password"); - } catch (StepikClientException e) { - setErrorText("Connection failed"); - } - } - - private boolean validateLoginAndPasswordFields() { - if (StringUtil.isEmptyOrSpaces(loginPanel.getLogin())) { - setErrorText("Please, enter your username"); - return false; - } - if (StringUtil.isEmptyOrSpaces(loginPanel.getPassword())) { - setErrorText("Please, enter your password"); - return false; - } - return true; - } - - private void doJustOkAction() { - super.doOKAction(); - } - - public void clearErrors() { - setErrorText(null); - } -} \ No newline at end of file diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form b/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form deleted file mode 100644 index 5bbc0864..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.form +++ /dev/null @@ -1,59 +0,0 @@ - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java deleted file mode 100644 index aea95b45..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/LoginPanel.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jetbrains.tmp.learning.ui; - -import com.intellij.ide.BrowserUtil; -import com.intellij.ui.DocumentAdapter; -import com.intellij.ui.components.JBLabel; -import com.jetbrains.tmp.learning.stepik.EduStepikNames; -import com.jetbrains.tmp.learning.stepik.LoginDialog; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -public class LoginPanel { - private JPanel contentPanel; - private JPasswordField passwordField; - private JTextField loginField; - private JBLabel signUpLabel; - - public LoginPanel(final LoginDialog dialog) { - DocumentListener listener = new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - dialog.clearErrors(); - } - }; - - loginField.getDocument().addDocumentListener(listener); - passwordField.getDocument().addDocumentListener(listener); - - signUpLabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - BrowserUtil.browse(EduStepikNames.STEPIK_SIGN_IN_LINK); - } - - @Override - public void mouseEntered(MouseEvent e) { - e.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - - @Override - public void mouseExited(MouseEvent e) { - e.getComponent().setCursor(Cursor.getDefaultCursor()); - } - }); - } - - public JPanel getContentPanel() { - return contentPanel; - } - - public String getPassword() { - return String.valueOf(passwordField.getPassword()); - } - - public String getLogin() { - return loginField.getText(); - } - - public JComponent getPreferableFocusComponent() { - return loginField; - } -} diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index cdc3cb67..0dc66032 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -84,7 +84,7 @@ public void changed( return; } String location = engine.getLocation(); - System.out.println(location); + if (location != null) { if (location.startsWith(Urls.STEPIK_URL + "/#")) { String paramString = location.split("#")[1]; From 5fa62df8a3a021110d29e25cd29044304e449bc9 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 00:14:28 +0700 Subject: [PATCH 34/55] Show error page when connection failed --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 10 +++++ core/src/main/resources/templates/error.ftl | 45 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 core/src/main/resources/templates/error.ftl diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 0dc66032..b6df9267 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -13,6 +13,7 @@ import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import org.stepik.api.urls.Urls; +import org.stepik.core.templates.Templater; import javax.swing.*; import java.awt.*; @@ -83,6 +84,15 @@ public void changed( if (newState == Worker.State.CANCELLED) { return; } + + if (newState == Worker.State.FAILED) { + Map map = new HashMap<>(); + map.put("url", engine.getLocation()); + String content = Templater.processTemplate("error", map); + engine.loadContent(content); + return; + } + String location = engine.getLocation(); if (location != null) { diff --git a/core/src/main/resources/templates/error.ftl b/core/src/main/resources/templates/error.ftl new file mode 100644 index 00000000..f75f879a --- /dev/null +++ b/core/src/main/resources/templates/error.ftl @@ -0,0 +1,45 @@ +<#-- @ftlvariable name="url" type="java.lang.String" --> + + + + Error + + + + +

    Connection failed

    +
    +
      +
    • Check internet connection options
    • +
    + +Try again + + \ No newline at end of file From 610b83248e2b37e31730fe89ced8300c8b1325b9 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 01:45:56 +0700 Subject: [PATCH 35/55] Added goBack button --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 58 ++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index b6df9267..5fe37fb4 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -1,22 +1,32 @@ package org.stepik.plugin.auth.ui; +import com.intellij.icons.AllIcons; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.embed.swing.JFXPanel; +import javafx.embed.swing.SwingFXUtils; +import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Scene; +import javafx.scene.control.Button; import javafx.scene.control.ProgressBar; -import javafx.scene.layout.StackPane; +import javafx.scene.image.ImageView; +import javafx.scene.image.WritableImage; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; import javafx.scene.web.WebEngine; +import javafx.scene.web.WebHistory; import javafx.scene.web.WebView; import org.stepik.api.urls.Urls; import org.stepik.core.templates.Templater; import javax.swing.*; import java.awt.*; +import java.awt.image.BufferedImage; import java.net.CookieHandler; import java.net.CookieManager; import java.util.Arrays; @@ -29,7 +39,6 @@ public class AuthDialog extends JDialog { private final Map map = new HashMap<>(); private WebEngine engine; - private WebView webComponent; private Node progressBar; private JFXPanel panel; @@ -40,17 +49,26 @@ private AuthDialog(boolean clear) { setLocationRelativeTo(null); setLayout(new BorderLayout()); setPanel(new JFXPanel()); + Platform.runLater(() -> { - StackPane pane = new StackPane(); - webComponent = new WebView(); + BorderPane pane = new BorderPane(); + HBox toolPane = new HBox(); + toolPane.setSpacing(5); + toolPane.setAlignment(Pos.CENTER_LEFT); + WebView webComponent = new WebView(); engine = webComponent.getEngine(); progressBar = makeProgressBarWithListener(); - webComponent.setVisible(false); - pane.getChildren().addAll(webComponent, progressBar); + pane.setTop(toolPane); + pane.setCenter(webComponent); Scene scene = new Scene(pane); panel.setScene(scene); panel.setVisible(true); + Button backButton = makeGoBackButton(); + addButtonsAvailabilityListeners(backButton); + toolPane.getChildren().addAll(backButton, progressBar); + toolPane.setPadding(new Insets(5)); + if (clear) { CookieManager manager = new CookieManager(); CookieHandler.setDefault(manager); @@ -69,6 +87,30 @@ public static Map showAuthForm(boolean clear) { return instance.map; } + private void addButtonsAvailabilityListeners(Button goBackButton) { + Platform.runLater(() -> engine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> { + if (newState == Worker.State.SUCCEEDED) { + WebHistory history = engine.getHistory(); + boolean isGoBackDisable = history.getCurrentIndex() <= 0; + goBackButton.setDisable(isGoBackDisable); + } + })); + } + + private Button makeGoBackButton() { + Icon icon = AllIcons.Actions.Back; + BufferedImage bImg = new BufferedImage(icon.getIconWidth(), icon.getIconWidth(), BufferedImage.TYPE_INT_ARGB); + Graphics2D graphics = bImg.createGraphics(); + icon.paintIcon(null, graphics, 0, 0); + graphics.dispose(); + WritableImage image = SwingFXUtils.toFXImage(bImg, null); + final Button button = new Button(null, new ImageView(image)); + button.setDisable(true); + button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); + + return button; + } + private ProgressBar makeProgressBarWithListener() { final ProgressBar progress = new ProgressBar(); Worker loadWorker = engine.getLoadWorker(); @@ -116,9 +158,9 @@ public void changed( } } + progressBar.setVisible(newState == Worker.State.RUNNING); + if (newState == Worker.State.SUCCEEDED) { - progressBar.setVisible(false); - webComponent.setVisible(true); AuthDialog.this.setTitle(engine.getTitle()); } } From 1ea9b29a09dfebf492d94037121cffce0f9f2e07 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 14:50:29 +0700 Subject: [PATCH 36/55] Added home button --- .../org/stepik/plugin/auth/ui/AuthDialog.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 5fe37fb4..8426bdce 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -21,6 +21,7 @@ import javafx.scene.web.WebEngine; import javafx.scene.web.WebHistory; import javafx.scene.web.WebView; +import org.jetbrains.annotations.NotNull; import org.stepik.api.urls.Urls; import org.stepik.core.templates.Templater; @@ -38,6 +39,7 @@ */ public class AuthDialog extends JDialog { private final Map map = new HashMap<>(); + private String url; private WebEngine engine; private Node progressBar; private JFXPanel panel; @@ -66,7 +68,8 @@ private AuthDialog(boolean clear) { Button backButton = makeGoBackButton(); addButtonsAvailabilityListeners(backButton); - toolPane.getChildren().addAll(backButton, progressBar); + Button homeButton = makeHomeButton(); + toolPane.getChildren().addAll(backButton, homeButton, progressBar); toolPane.setPadding(new Insets(5)); if (clear) { @@ -74,7 +77,7 @@ private AuthDialog(boolean clear) { CookieHandler.setDefault(manager); manager.getCookieStore().removeAll(); } - String url = StepikConnectorLogin.getImplicitGrantUrl(); + url = StepikConnectorLogin.getImplicitGrantUrl(); engine.load(url); }); add(panel, BorderLayout.CENTER); @@ -98,17 +101,28 @@ private void addButtonsAvailabilityListeners(Button goBackButton) { } private Button makeGoBackButton() { - Icon icon = AllIcons.Actions.Back; + Button button = createButtonWithImage(AllIcons.Actions.Back); + button.setDisable(true); + button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); + + return button; + } + + private Button makeHomeButton() { + Button button = createButtonWithImage(AllIcons.Actions.Refresh); + button.setOnAction(event -> Platform.runLater(() -> engine.load(url))); + + return button; + } + + @NotNull + private Button createButtonWithImage(@NotNull Icon icon) { BufferedImage bImg = new BufferedImage(icon.getIconWidth(), icon.getIconWidth(), BufferedImage.TYPE_INT_ARGB); Graphics2D graphics = bImg.createGraphics(); icon.paintIcon(null, graphics, 0, 0); graphics.dispose(); WritableImage image = SwingFXUtils.toFXImage(bImg, null); - final Button button = new Button(null, new ImageView(image)); - button.setDisable(true); - button.setOnAction(event -> Platform.runLater(() -> engine.getHistory().go(-1))); - - return button; + return new Button(null, new ImageView(image)); } private ProgressBar makeProgressBarWithListener() { From 35930fadc1b1a56d70c8bd1b182333550afb47fc Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 16:30:31 +0700 Subject: [PATCH 37/55] Removed login with password from settings --- .../tmp/learning/stepik/AuthInfo.java | 51 ------ .../learning/stepik/StepikConnectorLogin.java | 117 +++---------- .../collective/ui/StepikSettingsPanel.form | 89 +++------- .../collective/ui/StepikSettingsPanel.java | 165 ++---------------- 4 files changed, 65 insertions(+), 357 deletions(-) delete mode 100644 core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java deleted file mode 100644 index 74443a73..00000000 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/AuthInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.jetbrains.tmp.learning.stepik; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.stepik.api.objects.auth.TokenInfo; - -/** - * @author meanmail - */ -class AuthInfo { - private TokenInfo tokenInfo; - private String password; - private String username; - - @Nullable - TokenInfo getTokenInfo() { - return tokenInfo; - } - - void setTokenInfo(@Nullable TokenInfo tokenInfo) { - this.tokenInfo = tokenInfo; - } - - @NotNull - String getPassword() { - if (password == null) { - password = ""; - } - return password; - } - - void setPassword(@Nullable String password) { - this.password = password; - } - - @NotNull - String getUsername() { - if (username == null) { - username = ""; - } - return username; - } - - void setUsername(@Nullable String username) { - this.username = username; - } - - boolean canBeValid() { - return username != null && !username.isEmpty() && password != null && !password.isEmpty(); - } -} diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index a62eac71..334b72b8 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -62,9 +62,9 @@ private static StepikApiClient initStepikApiClient() { long lastUserId = getLastUser(); - AuthInfo authInfo = getAuthInfo(lastUserId, client); + TokenInfo tokenInfo = getTokenInfo(lastUserId, client); - client.setTokenInfo(authInfo.getTokenInfo()); + client.setTokenInfo(tokenInfo); return client; } @@ -78,9 +78,9 @@ private static StepikApiClient initStepikApiClient() { *
  • Show a dialog box for getting an username and a password
  • * */ - public static void authentication() { - AuthInfo authInfo = getAuthInfo(getLastUser()); - if (!minorLogin(authInfo)) { + public static synchronized void authentication() { + TokenInfo tokenInfo = getTokenInfo(getLastUser()); + if (!minorLogin(tokenInfo)) { showAuthDialog(false); } } @@ -90,16 +90,20 @@ private static void showAuthDialog(boolean clear) { logger.info("Show the authentication dialog"); Map map = AuthDialog.showAuthForm(clear); - TokenInfo tokenInfo = stepikApiClient.getTokenInfo(); + TokenInfo tokenInfo = new TokenInfo(); tokenInfo.setAccessToken(map.get("access_token")); tokenInfo.setExpiresIn(Integer.valueOf(map.getOrDefault("expires_in", "0"))); tokenInfo.setScope(map.get("scope")); tokenInfo.setTokenType(map.get("token_type")); - tokenInfo.setRefreshToken(null); + tokenInfo.setRefreshToken(map.get("refresh_token")); + stepikApiClient.setTokenInfo(tokenInfo); + if (tokenInfo.getAccessToken() != null) { + Metrics.authenticate(SUCCESSFUL); + } }, ModalityState.defaultModalityState()); } - private static boolean minorLogin(@NotNull AuthInfo authInfo) { + private static boolean minorLogin(@NotNull TokenInfo tokenInfo) { logger.info("Check the authentication"); if (stepikApiClient.getTokenInfo().getAccessToken() != null) { @@ -112,8 +116,8 @@ private static boolean minorLogin(@NotNull AuthInfo authInfo) { } String refreshToken = stepikApiClient.getTokenInfo().getRefreshToken(); - if (refreshToken == null && authInfo.getTokenInfo() != null) { - refreshToken = authInfo.getTokenInfo().getRefreshToken(); + if (refreshToken == null) { + refreshToken = tokenInfo.getRefreshToken(); } if (refreshToken != null) { @@ -129,29 +133,18 @@ private static boolean minorLogin(@NotNull AuthInfo authInfo) { } } - if (authInfo.canBeValid()) { - try { - logger.info("Try execute the Authentication with a password"); - authenticate(authInfo.getUsername(), authInfo.getPassword()); - logger.info("The Authentication with a password is successfully"); - return true; - } catch (StepikClientException e) { - logger.info("The Authentication with a password failed: " + e.getMessage()); - } - } - return false; } @NotNull - private static AuthInfo getAuthInfo(long userId) { - return getAuthInfo(userId, stepikApiClient); + private static TokenInfo getTokenInfo(long userId) { + return getTokenInfo(userId, stepikApiClient); } @NotNull - private static AuthInfo getAuthInfo(long userId, StepikApiClient client) { + private static TokenInfo getTokenInfo(long userId, StepikApiClient client) { if (userId == 0) { - return new AuthInfo(); + return new TokenInfo(); } String serviceName = StepikProjectManager.class.getName(); CredentialAttributes attributes = new CredentialAttributes(serviceName, @@ -162,27 +155,21 @@ private static AuthInfo getAuthInfo(long userId, StepikApiClient client) { synchronized (StepikConnectorLogin.class) { serializedAuthInfo = PasswordSafe.getInstance().getPassword(attributes); } - AuthInfo authInfo = client.getJsonConverter().fromJson(serializedAuthInfo, AuthInfo.class); + TokenInfo authInfo = client.getJsonConverter().fromJson(serializedAuthInfo, TokenInfo.class); if (authInfo == null) { - return new AuthInfo(); + return new TokenInfo(); } return authInfo; } - @NotNull - public static String getCurrentUserPassword() { - User currentUser = getCurrentUser(); - return getAuthInfo(currentUser.getId()).getPassword(); - } - - private static void setAuthInfo(long userId, @NotNull final AuthInfo authInfo) { + private static void setAuthInfo(long userId, @NotNull final TokenInfo tokenInfo) { String serviceName = StepikProjectManager.class.getName(); CredentialAttributes attributes = new CredentialAttributes(serviceName, String.valueOf(userId), StepikProjectManager.class, false); - String serializedAuthInfo = stepikApiClient.getJsonConverter().toJson(authInfo); + String serializedAuthInfo = stepikApiClient.getJsonConverter().toJson(tokenInfo); synchronized (StepikConnectorLogin.class) { PasswordSafe.getInstance().setPassword(attributes, serializedAuthInfo); setLastUser(userId); @@ -194,25 +181,6 @@ public static StepikApiClient getStepikApiClient() { return stepikApiClient; } - @NotNull - public static User testAuthentication(@Nullable String username, @Nullable String password) { - TokenInfo currentTokenInfo = stepikApiClient.getTokenInfo(); - - User testUser; - try { - authenticate(username, password); - logger.info("The test authentication is successfully"); - testUser = getCurrentUser(); - } catch (StepikClientException e) { - logger.info("The test authentication failed"); - throw e; - } finally { - stepikApiClient.setTokenInfo(currentTokenInfo); - } - - return testUser; - } - @NotNull public static User getCurrentUser() { try { @@ -226,33 +194,6 @@ public static User getCurrentUser() { } } - public static void authenticate(@Nullable String username, @Nullable String password) { - try { - stepikApiClient.oauth2() - .userAuthenticationPassword(CLIENT_ID, username, password) - .execute(); - - AuthInfo authInfo = new AuthInfo(); - authInfo.setTokenInfo(stepikApiClient.getTokenInfo()); - authInfo.setUsername(username); - authInfo.setPassword(password); - - long userId = getCurrentUser().getId(); - setAuthInfo(userId, authInfo); - logger.info("Authentication is successfully"); - Metrics.authenticate(SUCCESSFUL); - } catch (StepikClientException e) { - logger.warn("Authentication failed", e); - throw e; - } - } - - @NotNull - public static String getCurrentUsername() { - User currentUser = getCurrentUser(); - return getAuthInfo(currentUser.getId()).getUsername(); - } - @NotNull public static String getCurrentUserFullName() { User user = getCurrentUser(); @@ -264,14 +205,12 @@ public static StepikApiClient authAndGetStepikApiClient() { return stepikApiClient; } - public static void logout() { - synchronized (StepikConnectorLogin.class) { - stepikApiClient.setTokenInfo(null); - long userId = getLastUser(); - setAuthInfo(userId, new AuthInfo()); - setLastUser(0); - logger.info("Logout successfully"); - } + public static synchronized void logout() { + stepikApiClient.setTokenInfo(null); + long userId = getLastUser(); + setAuthInfo(userId, new TokenInfo()); + setLastUser(0); + logger.info("Logout successfully"); } @Nullable diff --git a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form index f7165b95..33c894c4 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form +++ b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.form @@ -1,9 +1,9 @@
    - + - + @@ -11,23 +11,6 @@ - - - - - - - - - - - - - - - - - @@ -35,47 +18,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -83,34 +31,41 @@ - + - + + + + + + - - + - + - + - + - + - + - + - + + + + diff --git a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java index bcd3941c..49a79deb 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java +++ b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java @@ -1,202 +1,67 @@ package org.stepik.plugin.collective.ui; -import com.intellij.ide.BrowserUtil; -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.ThrowableComputable; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.ui.DocumentAdapter; -import com.intellij.ui.HyperlinkAdapter; import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.stepik.EduStepikNames; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; -import org.intellij.lang.annotations.Language; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.stepik.api.exceptions.StepikClientException; -import org.stepik.api.exceptions.StepikUnauthorizedException; -import org.stepik.api.objects.users.User; import org.stepik.core.utils.Utils; import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.HyperlinkEvent; -import javax.swing.text.Document; -import javax.swing.text.PlainDocument; -import java.awt.*; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; - -import static com.intellij.openapi.ui.Messages.showMessageDialog; -import static com.intellij.openapi.ui.Messages.showWarningDialog; class StepikSettingsPanel { - private static final String DEFAULT_PASSWORD_TEXT = "************"; - private static final String TEST_CONNECTION = "Test connection"; - private static final String CHECK_CREDENTIALS = "Check credentials"; - private static final String WRONG_LOGIN_PASSWORD = "Wrong a login or a password"; - private static final String FAILED_CONNECTION = "Failed connection"; - private JTextField emailTextField; - private JPasswordField passwordField; - private JTextPane signupTextField; private JPanel pane; - private JButton testButton; private JCheckBox hintCheckBox; private JButton logoutButton; + private JLabel userName; + private JButton loginButton; - private boolean credentialsModified; private boolean hintCheckBoxModified; private StepikProjectManager projectManager; StepikSettingsPanel() { initProjectOfSettings(); - signupTextField.addHyperlinkListener(new HyperlinkAdapter() { - @Override - protected void hyperlinkActivated(final HyperlinkEvent e) { - BrowserUtil.browse(e.getURL()); - } - }); - @Language("HTML") - String signupText = "Do not have an account at stepik.org? Sign up"; - signupTextField.setText(String.format(signupText, EduStepikNames.STEPIK_SIGN_IN_LINK)); - signupTextField.setBackground(pane.getBackground()); - signupTextField.setCursor(new Cursor(Cursor.HAND_CURSOR)); hintCheckBox.setSelected(projectManager != null && projectManager.getShowHint()); hintCheckBox.addActionListener(e -> hintCheckBoxModified = true); - testButton.addActionListener(event -> { - try { - String login = getEmail(); - String password = getPassword(); - - User user = ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - return StepikConnectorLogin.testAuthentication(login, password); - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - String fullName = user.getFirstName() + " " + user.getLastName(); - String message = "Hello, " + fullName + "!\n I am glad to see you."; - showMessageDialog(message, TEST_CONNECTION, Messages.getInformationIcon()); - } catch (StepikUnauthorizedException e) { - showWarningDialog(WRONG_LOGIN_PASSWORD, TEST_CONNECTION); - } catch (StepikClientException e) { - showWarningDialog(FAILED_CONNECTION, TEST_CONNECTION); - } - }); - - emailTextField.getDocument().addDocumentListener(new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - if (!credentialsModified) { - erasePassword(); - } - } - }); - - passwordField.addFocusListener(new FocusAdapter() { - @Override - public void focusGained(FocusEvent e) { - if (!credentialsModified && !getPassword().isEmpty()) { - erasePassword(); - } - } - }); - - passwordField.getDocument().addDocumentListener(new DocumentAdapter() { - @Override - protected void textChanged(DocumentEvent e) { - credentialsModified = true; - } - }); logoutButton.addActionListener(e -> { - reset(); StepikConnectorLogin.logout(); + updateUserName(); + }); + + loginButton.addActionListener(e -> { + StepikConnectorLogin.authentication(); + updateUserName(); }); } - private void erasePassword() { - setPasswordFieldText(""); - credentialsModified = true; + private void updateUserName() { + userName.setText(StepikConnectorLogin.getCurrentUserFullName()); } JComponent getPanel() { return pane; } - @NotNull - private String getEmail() { - return emailTextField.getText().trim(); - } - - private void setLogin(@Nullable final String login) { - emailTextField.setText(login); - } - - @NotNull - private String getPassword() { - if (!credentialsModified) { - initProjectOfSettings(); - return StepikConnectorLogin.getCurrentUserPassword(); - } - return String.valueOf(passwordField.getPassword()); - } - - private void setPasswordFieldText(@NotNull final String password) { - // Show password as blank if password is empty - passwordField.setText(StringUtil.isEmpty(password) ? "" : password); - } - private void initProjectOfSettings() { projectManager = StepikProjectManager.getInstance(Utils.getCurrentProject()); } void reset() { initProjectOfSettings(); - setLogin(StepikConnectorLogin.getCurrentUsername()); - setPasswordFieldText(DEFAULT_PASSWORD_TEXT); - resetCredentialsModification(); + resetModification(); + updateUserName(); } void apply() { - if (credentialsModified) { - initProjectOfSettings(); - - try { - String login = getEmail(); - String password = getPassword(); - - ProgressManager.getInstance() - .runProcessWithProgressSynchronously((ThrowableComputable) () -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - StepikConnectorLogin.authenticate(login, password); - return null; - }, "Connection at Stepik", true, Utils.getCurrentProject()); - - } catch (StepikUnauthorizedException e) { - showWarningDialog(WRONG_LOGIN_PASSWORD, CHECK_CREDENTIALS); - } catch (StepikClientException e) { - showWarningDialog(FAILED_CONNECTION, CHECK_CREDENTIALS); - } - } - if (hintCheckBoxModified && projectManager != null) { projectManager.setShowHint(hintCheckBox.isSelected()); } - resetCredentialsModification(); + resetModification(); } boolean isModified() { - return credentialsModified || hintCheckBoxModified; + return hintCheckBoxModified; } - private void resetCredentialsModification() { - credentialsModified = false; + private void resetModification() { hintCheckBoxModified = false; } - - private void createUIComponents() { - Document doc = new PlainDocument(); - passwordField = new JPasswordField(doc, null, 0); - } } From 81a853219447cd133c0494a7366aa8264625c3e1 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 12 Mar 2017 17:15:29 +0700 Subject: [PATCH 38/55] A "implicit grant" url is constant --- .../learning/stepik/StepikConnectorLogin.java | 16 ++++------------ .../org/stepik/plugin/auth/ui/AuthDialog.java | 2 +- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index 334b72b8..fb66ad74 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -18,25 +18,21 @@ import org.stepik.core.metrics.Metrics; import org.stepik.plugin.auth.ui.AuthDialog; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.util.Map; -import static java.nio.charset.StandardCharsets.UTF_8; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; public class StepikConnectorLogin { private static final Logger logger = Logger.getInstance(StepikConnectorLogin.class); private static final String CLIENT_ID = "vV8giW7KTPMOTriOUBwyGLvXbKV0Cc4GPBnyCJPd"; - private static final String REDIRECT_URI = "https://stepik.org"; + private static final String REDIRECT_URI = "https%3A%2F%2Fstepik.org"; private static final String LAST_USER_PROPERTY_NAME = PLUGIN_ID + ".LAST_USER"; private static final StepikApiClient stepikApiClient = initStepikApiClient(); - private static final String IMPLICIT_GRANT_URL_TEMPLATE = "https://stepik.org/oauth2/authorize/" + + private static final String IMPLICIT_GRANT_URL = "https://stepik.org/oauth2/authorize/" + "?client_id=" + CLIENT_ID + - "&redirect_uri=%s" + + "&redirect_uri=" + REDIRECT_URI + "&scope=write" + - "&state=%s" + "&response_type=token"; private static long getLastUser() { @@ -215,11 +211,7 @@ public static synchronized void logout() { @Nullable public static String getImplicitGrantUrl() { - try { - return String.format(IMPLICIT_GRANT_URL_TEMPLATE, URLEncoder.encode(REDIRECT_URI, UTF_8.name()), "1234"); - } catch (UnsupportedEncodingException e) { - return null; - } + return IMPLICIT_GRANT_URL; } public static void logoutAndAuth() { diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 8426bdce..4b1e5ec2 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -159,7 +159,7 @@ public void changed( Arrays.stream(params).forEach(param -> { String[] entry = param.split("="); String value = ""; - if (entry.length > 0) { + if (entry.length > 1) { value = entry[1]; } map.put(entry[0], value); From c57975c78a0b9f87680e8ff9db31fb8c40069fa2 Mon Sep 17 00:00:00 2001 From: meanmail Date: Sun, 19 Mar 2017 23:15:37 +0700 Subject: [PATCH 39/55] Async update status --- .../tmp/learning/StepikProjectManager.java | 50 ++++----- .../tmp/learning/courseFormat/CourseNode.java | 15 ++- .../tmp/learning/courseFormat/LessonNode.java | 15 ++- .../tmp/learning/courseFormat/Node.java | 103 ++++++++++-------- .../learning/courseFormat/SectionNode.java | 15 ++- .../tmp/learning/courseFormat/StepNode.java | 15 ++- .../tmp/learning/courseFormat/StudyNode.java | 12 +- .../courseFormat/StudyNodeFactory.java | 17 ++- .../learning/stepik/StepikConnectorLogin.java | 52 ++++++--- .../org/stepik/plugin/auth/ui/AuthDialog.java | 2 +- .../projectWizard/StepikProjectGenerator.java | 2 +- 11 files changed, 178 insertions(+), 120 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java b/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java index 86f68f52..dc883116 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java @@ -11,8 +11,6 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleWithNameAlreadyExists; import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -285,35 +283,31 @@ public void loadState(Element state) { } private void refreshCourse() { - if (getProjectRoot() == null) { + if (getProjectRoot() == null || project == null) { return; } - ProgressManager.getInstance() - .runProcessWithProgressSynchronously(() -> { - ProgressIndicator indicator = ProgressManager.getInstance() - .getProgressIndicator(); - indicator.setIndeterminate(true); - root.reloadData(indicator); - }, "Refreshing Course", true, project); - ApplicationManager.getApplication().invokeLater(() -> { - repairProjectFiles(root); - VirtualFileManager.getInstance().syncRefresh(); - - VirtualFile projectDir = project != null ? project.getBaseDir() : null; - if (projectDir != null && projectDir.findChild(EduNames.SANDBOX_DIR) == null) { - ModifiableModuleModel model = ModuleManager.getInstance(project).getModifiableModel(); - - ApplicationManager.getApplication().runWriteAction(() -> { - try { - new SandboxModuleBuilder(projectDir.getPath()).createModule(model); - model.commit(); - } catch (IOException | ConfigurationException | JDOMException | ModuleWithNameAlreadyExists e) { - logger.warn("Failed repair Sandbox", e); - } - }); - } - }); + root.reloadData(project, null); + repairProjectFiles(root); + + VirtualFile projectDir = project.getBaseDir(); + if (projectDir != null && projectDir.findChild(EduNames.SANDBOX_DIR) == null) { + ModifiableModuleModel model = ModuleManager.getInstance(project) + .getModifiableModel(); + + ApplicationManager.getApplication().runWriteAction(() -> { + try { + new SandboxModuleBuilder(projectDir.getPath()).createModule(model); + model.commit(); + } catch (IOException | ConfigurationException | JDOMException | ModuleWithNameAlreadyExists e) { + logger.warn("Failed repair Sandbox", e); + } + }); + } + + ApplicationManager.getApplication().invokeLater(() -> + VirtualFileManager.getInstance().syncRefresh() + ); } private void repairProjectFiles(@NotNull StudyNode node) { diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java index 49b11583..ad8d8f86 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java @@ -2,6 +2,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,8 +27,11 @@ public class CourseNode extends Node { public CourseNode() { } - public CourseNode(@NotNull Course data, @Nullable ProgressIndicator indicator) { - super(data, indicator); + public CourseNode( + @NotNull Project project, + @NotNull Course data, + @Nullable ProgressIndicator indicator) { + super(project, data, indicator); } @Override @@ -53,7 +57,10 @@ protected List
    getChildDataList() { } @Override - public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicator) { + public void init( + @NotNull Project project, + @Nullable StudyNode parent, + @Nullable ProgressIndicator indicator) { if (indicator != null) { indicator.setText("Refresh " + getName()); indicator.setText2("Update sections"); @@ -61,7 +68,7 @@ public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicat authors = null; - super.init(parent, indicator); + super.init(project, parent, indicator); } @Override diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java index 6c7cd304..3bbaa84a 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java @@ -2,6 +2,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.core.EduNames; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; @@ -27,8 +28,11 @@ public class LessonNode extends Node getChildDataList() { } @Override - public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicator) { + public void init( + @NotNull Project project, + @Nullable StudyNode parent, + @Nullable ProgressIndicator indicator) { if (indicator != null) { indicator.setText("Refresh a lesson: " + getName()); indicator.setText2("Update steps"); @@ -62,7 +69,7 @@ public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicat courseId = 0; - super.init(parent, indicator); + super.init(project, parent, indicator); } @Override diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java index 5351b5b2..6571de86 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java @@ -1,7 +1,9 @@ package com.jetbrains.tmp.learning.courseFormat; +import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import com.thoughtworks.xstream.annotations.XStreamOmitField; import org.jetbrains.annotations.NotNull; @@ -16,6 +18,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import static com.jetbrains.tmp.learning.courseFormat.StudyStatus.SOLVED; @@ -33,14 +37,17 @@ public abstract class Node< private List children; private boolean wasDeleted; @XStreamOmitField - private StudyStatus status; + private volatile StudyStatus status; + @XStreamOmitField + private Project project; + private static final ExecutorService executor = Executors.newSingleThreadExecutor(); Node() { } - Node(@NotNull D data, @Nullable ProgressIndicator indicator) { + Node(@NotNull Project project, @NotNull D data, @Nullable ProgressIndicator indicator) { setData(data); - init(null, indicator); + init(project, null, indicator); } @Nullable @@ -193,7 +200,8 @@ public List getChildren() { protected abstract List getChildDataList(); @Override - public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicator) { + public void init(@NotNull Project project, @Nullable StudyNode parent, @Nullable ProgressIndicator indicator) { + this.project = project; Map mapNodes = getMapNodes(); List needInit = getChildren(); setChildrenDeletedFlag(); @@ -213,7 +221,7 @@ public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicat } item.setData(data); item.setWasDeleted(wasDeleted); - item.init(this, indicator); + item.init(project, this, indicator); if (item.canBeLeaf() || !item.isLeaf()) { getChildren().add(item); } @@ -224,7 +232,7 @@ public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicat setParent(parent); for (StudyNode child : needInit) { - child.init(this, indicator); + child.init(project, this, indicator); } } @@ -233,9 +241,9 @@ private void setChildrenDeletedFlag() { } @Override - public void reloadData(@NotNull ProgressIndicator indicator) { + public void reloadData(@NotNull Project project, @Nullable ProgressIndicator indicator) { loadData(data.getId()); - init(indicator); + init(project, indicator); } protected abstract void loadData(long id); @@ -250,48 +258,51 @@ public boolean isUnknownStatus() { @NotNull @Override public StudyStatus getStatus() { - if (status == null) { + if (isUnknownStatus()) { status = StudyStatus.UNCHECKED; - try { - Map progressMap = new HashMap<>(); - getChildren().stream() - .filter(StudyNode::isUnknownStatus) - .forEach(child -> { - DC data = child.getData(); - if (data != null) { - progressMap.put(data.getProgress(), child); - } - }); - D data = getData(); - if (data != null) { - String progressId = data.getProgress(); - if (progressId != null) { - progressMap.put(progressId, this); - } - - Set progressIds = progressMap.keySet(); - - if (progressIds.size() != 0) { - StepikApiClient stepikApiClient = StepikConnectorLogin.authAndGetStepikApiClient(); - - Progresses progresses = stepikApiClient.progresses() - .get() - .id(progressIds.toArray(new String[progressIds.size()])) - .execute(); - - progresses.getItems().forEach(progress -> { - String id = progress.getId(); - StudyNode node = progressMap.get(id); - if (progress.isPassed()) { - node.setRawStatus(SOLVED); - } - }); + executor.execute(() -> { + try { + Map progressMap = new HashMap<>(); + Node.this.getChildren().stream() + .filter(StudyNode::isUnknownStatus) + .forEach(child -> { + DC data = child.getData(); + if (data != null) { + progressMap.put(data.getProgress(), child); + } + }); + D data = Node.this.getData(); + if (data != null) { + String progressId = data.getProgress(); + if (progressId != null) { + progressMap.put(progressId, Node.this); + } + + Set progressIds = progressMap.keySet(); + + if (progressIds.size() != 0) { + StepikApiClient stepikApiClient = StepikConnectorLogin.authAndGetStepikApiClient(); + + Progresses progresses = stepikApiClient.progresses() + .get() + .id(progressIds.toArray(new String[progressIds.size()])) + .execute(); + + progresses.getItems().forEach(progress -> { + String id = progress.getId(); + StudyNode node = progressMap.get(id); + if (progress.isPassed()) { + node.setRawStatus(SOLVED); + } + }); + } } + ProjectView.getInstance(project).refresh(); + } catch (StepikClientException e) { + logger.warn(e); } - } catch (StepikClientException e) { - logger.warn(e); - } + }); } return status; diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java index d4f4e207..d3741bd7 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java @@ -2,6 +2,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.core.EduNames; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; @@ -31,18 +32,24 @@ public class SectionNode extends Node { public StepNode() {} - public StepNode(@NotNull Step data, @Nullable ProgressIndicator indicator) { - super(data, indicator); + public StepNode( + @NotNull Project project, + @NotNull Step data, + @Nullable ProgressIndicator indicator) { + super(project, data, indicator); } @Override - public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicator) { + public void init( + @NotNull Project project, + @Nullable StudyNode parent, + @Nullable ProgressIndicator indicator) { if (indicator != null) { indicator.setText("Refresh a step: " + getName()); indicator.setText2(""); @@ -60,7 +67,7 @@ public void init(@Nullable StudyNode parent, @Nullable ProgressIndicator indicat supportedLanguages = null; courseId = 0; - super.init(parent, indicator); + super.init(project, parent, indicator); } @Override diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java index 74918f3c..1c638b36 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java @@ -1,6 +1,7 @@ package com.jetbrains.tmp.learning.courseFormat; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.objects.StudyObject; @@ -54,15 +55,18 @@ public interface StudyNode { void setData(@Nullable D data); - void init(@Nullable final StudyNode parent, @Nullable ProgressIndicator indicator); + void init( + @NotNull Project project, + @Nullable final StudyNode parent, + @Nullable ProgressIndicator indicator); - default void init(@Nullable ProgressIndicator indicator) { - init(null, indicator); + default void init(@NotNull Project project, @Nullable ProgressIndicator indicator) { + init(project, null, indicator); } boolean canBeLeaf(); - void reloadData(@NotNull ProgressIndicator indicator); + void reloadData(@NotNull Project project, @Nullable ProgressIndicator indicator); boolean getWasDeleted(); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java index 2d501fd5..14ea17dd 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java @@ -1,7 +1,9 @@ package com.jetbrains.tmp.learning.courseFormat; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.stepik.api.objects.StudyObject; import org.stepik.api.objects.courses.Course; import org.stepik.api.objects.lessons.CompoundUnitLesson; @@ -13,19 +15,22 @@ * @author meanmail */ public class StudyNodeFactory { - public static StudyNode createTree(@NotNull StudyObject data, ProgressIndicator indicator) { + public static StudyNode createTree( + @NotNull Project project, + @NotNull StudyObject data, + @Nullable ProgressIndicator indicator) { StudyNode root = null; if (data instanceof Course) { - root = new CourseNode((Course) data, indicator); + root = new CourseNode(project, (Course) data, indicator); } else if (data instanceof Section) { - root = new SectionNode((Section) data, indicator); + root = new SectionNode(project, (Section) data, indicator); } else if (data instanceof Lesson) { CompoundUnitLesson compoundData = new CompoundUnitLesson(null, (Lesson) data); - root = new LessonNode(compoundData, indicator); + root = new LessonNode(project, compoundData, indicator); } else if (data instanceof CompoundUnitLesson) { - root = new LessonNode((CompoundUnitLesson) data, indicator); + root = new LessonNode(project, (CompoundUnitLesson) data, indicator); } else if (data instanceof Step) { - root = new StepNode((Step) data, indicator); + root = new StepNode(project, (Step) data, indicator); } return root; } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index fb66ad74..95c13e50 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -3,6 +3,7 @@ import com.intellij.credentialStore.CredentialAttributes; import com.intellij.ide.passwordSafe.PasswordSafe; import com.intellij.ide.util.PropertiesComponent; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; @@ -82,35 +83,50 @@ public static synchronized void authentication() { } private static void showAuthDialog(boolean clear) { - ApplicationManager.getApplication().invokeAndWait(() -> { - logger.info("Show the authentication dialog"); - Map map = AuthDialog.showAuthForm(clear); - - TokenInfo tokenInfo = new TokenInfo(); - tokenInfo.setAccessToken(map.get("access_token")); - tokenInfo.setExpiresIn(Integer.valueOf(map.getOrDefault("expires_in", "0"))); - tokenInfo.setScope(map.get("scope")); - tokenInfo.setTokenType(map.get("token_type")); - tokenInfo.setRefreshToken(map.get("refresh_token")); - stepikApiClient.setTokenInfo(tokenInfo); - if (tokenInfo.getAccessToken() != null) { - Metrics.authenticate(SUCCESSFUL); - } - }, ModalityState.defaultModalityState()); + Application application = ApplicationManager.getApplication(); + if (!application.isDispatchThread()) { + application.invokeAndWait(() -> showDialog(clear), ModalityState.defaultModalityState()); + } else { + showDialog(clear); + } } - private static boolean minorLogin(@NotNull TokenInfo tokenInfo) { - logger.info("Check the authentication"); + private static void showDialog(boolean clear) { + logger.info("Show the authentication dialog"); + Map map = AuthDialog.showAuthForm(clear); + + TokenInfo tokenInfo = new TokenInfo(); + tokenInfo.setAccessToken(map.get("access_token")); + tokenInfo.setExpiresIn(Integer.valueOf(map.getOrDefault("expires_in", "0"))); + tokenInfo.setScope(map.get("scope")); + tokenInfo.setTokenType(map.get("token_type")); + tokenInfo.setRefreshToken(map.get("refresh_token")); + stepikApiClient.setTokenInfo(tokenInfo); + if (tokenInfo.getAccessToken() != null) { + Metrics.authenticate(SUCCESSFUL); + } + } + public static boolean authenticated() { if (stepikApiClient.getTokenInfo().getAccessToken() != null) { User user = getCurrentUser(); if (!user.isGuest()) { - logger.info("Authenticated"); return true; } } + return false; + } + + private static boolean minorLogin(@NotNull TokenInfo tokenInfo) { + logger.info("Check the authentication"); + + if (authenticated()) { + logger.info("Authenticated"); + return true; + } + String refreshToken = stepikApiClient.getTokenInfo().getRefreshToken(); if (refreshToken == null) { refreshToken = tokenInfo.getRefreshToken(); diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 4b1e5ec2..6d2a3211 100644 --- a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -51,7 +51,7 @@ private AuthDialog(boolean clear) { setLocationRelativeTo(null); setLayout(new BorderLayout()); setPanel(new JFXPanel()); - + Platform.setImplicitExit(false); Platform.runLater(() -> { BorderPane pane = new BorderPane(); HBox toolPane = new HBox(); diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java b/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java index d963e7c2..239beea4 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java @@ -148,7 +148,7 @@ public void createCourseNodeUnderProgress(@NotNull final Project project, @NotNu ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); indicator.setIndeterminate(true); - projectRoot = StudyNodeFactory.createTree(data, indicator); + projectRoot = StudyNodeFactory.createTree(project, data, indicator); }, "Creating project", true, project); } From 03beacd8d550139a3f7278535fb8185ad628d10d Mon Sep 17 00:00:00 2001 From: meanmail Date: Mon, 20 Mar 2017 01:01:59 +0700 Subject: [PATCH 40/55] Async load courses list (project wizard) --- .../projectWizard/StepikProjectGenerator.java | 21 +------- .../projectWizard/ui/CourseListBox.java | 6 +-- .../projectWizard/ui/CourseListModel.java | 49 ++++++++++++------- .../ui/ProjectSettingsPanel.java | 6 +-- 4 files changed, 37 insertions(+), 45 deletions(-) diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java b/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java index 239beea4..996aea94 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java @@ -53,7 +53,7 @@ public static StepikProjectGenerator getInstance() { } @NotNull - private static List getCourses(@NotNull SupportedLanguages programmingLanguage) { + public static List getCourses(@NotNull SupportedLanguages programmingLanguage) { List courses = new ArrayList<>(); List coursesIds = getHardcodedCoursesId(programmingLanguage); @@ -117,25 +117,6 @@ private static List getHardcodedCoursesId(@NotNull SupportedLanguages prog return Collections.emptyList(); } - @NotNull - public static List getCoursesUnderProgress( - @NotNull final Project project, - @NotNull SupportedLanguages programmingLanguage) { - try { - return ProgressManager.getInstance() - .runProcessWithProgressSynchronously(() -> { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - List courses = getCourses(programmingLanguage); - if (courses.isEmpty()) { - courses.add(EMPTY_STUDY_OBJECT); - } - return courses; - }, "Refreshing Course List", true, project); - } catch (RuntimeException e) { - return Collections.singletonList(EMPTY_STUDY_OBJECT); - } - } - public void createCourseNodeUnderProgress(@NotNull final Project project, @NotNull StudyObject data) { ProgressManager.getInstance() .runProcessWithProgressSynchronously(() -> { diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java index 2dd74c3c..a3497725 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java @@ -27,13 +27,13 @@ public CourseListBox() { setEditor(courseEditor); } - void refresh(@NotNull Project project, @NotNull SupportedLanguages programmingLanguage) { + void refresh(@NotNull SupportedLanguages programmingLanguage) { this.programmingLanguage = programmingLanguage; - courseListModel.update(project, programmingLanguage); + courseListModel.update(programmingLanguage); } void refresh(@NotNull Project project) { - courseListModel.update(project, programmingLanguage); + courseListModel.update(programmingLanguage); } void setTarget(@Nullable ProjectSetting target) { diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java index 2466f838..bebea00f 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java @@ -1,6 +1,5 @@ package org.stepik.plugin.projectWizard.ui; -import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.SupportedLanguages; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -12,12 +11,17 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; +import static org.stepik.plugin.projectWizard.StepikProjectGenerator.EMPTY_STUDY_OBJECT; + /** * @author meanmail */ class CourseListModel extends AbstractListModel implements ComboBoxModel, Serializable { + private static final ExecutorService executor = Executors.newSingleThreadExecutor(); private final List courses = new ArrayList<>(); private Object selectedItem; @@ -32,33 +36,42 @@ public StudyObject getElementAt(int index) { if (index >= 0 && index < courses.size()) { return courses.get(index); } else { - return StepikProjectGenerator.EMPTY_STUDY_OBJECT; + return EMPTY_STUDY_OBJECT; } } - void update(@NotNull Project project, @NotNull SupportedLanguages programmingLanguage) { - List newCourseList = StepikProjectGenerator.getCoursesUnderProgress(project, programmingLanguage); - StudyObject selectedCourse = getSelectedItem(); - courses.clear(); + void update(@NotNull SupportedLanguages programmingLanguage) { + executor.execute(new Runnable() { + @Override + public void run() { + List newCourseList = StepikProjectGenerator.getCourses(programmingLanguage); - if (!newCourseList.isEmpty()) { - courses.addAll(newCourseList); - if (selectedCourse == StepikProjectGenerator.EMPTY_STUDY_OBJECT || !courses.contains(selectedCourse)) { - selectedCourse = courses.get(0); - } - } else { - courses.add(StepikProjectGenerator.EMPTY_STUDY_OBJECT); - } + StudyObject selectedCourse = getSelectedItem(); + courses.clear(); + + if (!newCourseList.isEmpty()) { + courses.addAll(newCourseList); + if (selectedCourse == EMPTY_STUDY_OBJECT || !courses.contains(selectedCourse)) { + selectedCourse = courses.get(0); + } + } else { + courses.add(EMPTY_STUDY_OBJECT); + } - setSelectedItem(selectedCourse); - fireIntervalAdded(this, 0, getSize() - 1); + StudyObject finalSelectedCourse = selectedCourse; + SwingUtilities.invokeLater(() -> { + setSelectedItem(finalSelectedCourse); + fireIntervalAdded(this, 0, getSize() - 1); + }); + } + }); } @NotNull @Override public StudyObject getSelectedItem() { - if (selectedItem == null || !(selectedItem instanceof StudyObject)) { - return StepikProjectGenerator.EMPTY_STUDY_OBJECT; + if (!(selectedItem instanceof StudyObject)) { + return EMPTY_STUDY_OBJECT; } return (StudyObject) selectedItem; } diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java index 4599271a..f5212ba7 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java @@ -17,7 +17,6 @@ public class ProjectSettingsPanel implements ProjectSetting, HierarchyListener { private static final Logger logger = Logger.getInstance(ProjectSettingsPanel.class); - private final Project project; private final List listeners = new ArrayList<>(); private JPanel mainPanel; private JLabel nameLabel; @@ -33,7 +32,6 @@ public class ProjectSettingsPanel implements ProjectSetting, HierarchyListener { private StudyObject selectedStudyObject = StepikProjectGenerator.EMPTY_STUDY_OBJECT; public ProjectSettingsPanel(@NotNull Project project, boolean visibleLangBox) { - this.project = project; refreshListButton.setTarget(courseListComboBox, project); courseListComboBox.setTarget(this); @@ -63,7 +61,7 @@ public void updateStep() { logger.info("Start updating settings"); StepikConnectorLogin.authentication(); setUsername(); - courseListComboBox.refresh(project, langComboBox.getSelectedItem()); + courseListComboBox.refresh(langComboBox.getSelectedItem()); logger.info("Updating settings is done"); } @@ -101,7 +99,7 @@ public void removeListener(@NotNull ProjectSettingListener listener) { @Override public void selectedProgrammingLanguage(@NotNull SupportedLanguages language) { - courseListComboBox.refresh(project, language); + courseListComboBox.refresh(language); } @NotNull From 8041eef4eaacdf4fd768d7df72ee5192be3e68f3 Mon Sep 17 00:00:00 2001 From: meanmail Date: Mon, 20 Mar 2017 04:19:42 +0700 Subject: [PATCH 41/55] Async open and init project --- .../tmp/learning/StepikProjectManager.java | 50 ++++++++----- .../tmp/learning/courseFormat/CourseNode.java | 21 +----- .../tmp/learning/courseFormat/LessonNode.java | 21 +----- .../tmp/learning/courseFormat/Node.java | 26 ++++--- .../learning/courseFormat/SectionNode.java | 22 +----- .../tmp/learning/courseFormat/StepNode.java | 20 +---- .../tmp/learning/courseFormat/StudyNode.java | 17 +++-- .../courseFormat/StudyNodeFactory.java | 17 ++--- .../tmp/learning/ui/StudyToolWindow.java | 75 +++++++++++-------- .../projectWizard/StepikProjectGenerator.java | 2 +- .../projectWizard/ui/CourseListModel.java | 39 +++++----- .../plugin/utils/PresentationDataUtils.java | 8 +- 12 files changed, 146 insertions(+), 172 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java b/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java index dc883116..c0369a1e 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java @@ -11,6 +11,9 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleWithNameAlreadyExists; import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -287,27 +290,36 @@ private void refreshCourse() { return; } - root.reloadData(project, null); - repairProjectFiles(root); - - VirtualFile projectDir = project.getBaseDir(); - if (projectDir != null && projectDir.findChild(EduNames.SANDBOX_DIR) == null) { - ModifiableModuleModel model = ModuleManager.getInstance(project) - .getModifiableModel(); - - ApplicationManager.getApplication().runWriteAction(() -> { - try { - new SandboxModuleBuilder(projectDir.getPath()).createModule(model); - model.commit(); - } catch (IOException | ConfigurationException | JDOMException | ModuleWithNameAlreadyExists e) { - logger.warn("Failed repair Sandbox", e); + root.setProject(project); + + new Thread(() -> { + root.reloadData(project); + ProgressManager.getInstance().run(new Task.Backgroundable(project, "Synchronize project") { + @Override + public void run(@NotNull ProgressIndicator indicator) { + repairProjectFiles(root); + + VirtualFile projectDir = project.getBaseDir(); + if (projectDir != null && projectDir.findChild(EduNames.SANDBOX_DIR) == null) { + ModifiableModuleModel model = ModuleManager.getInstance(project) + .getModifiableModel(); + + ApplicationManager.getApplication().runWriteAction(() -> { + try { + new SandboxModuleBuilder(projectDir.getPath()).createModule(model); + model.commit(); + } catch (IOException | ConfigurationException | JDOMException | ModuleWithNameAlreadyExists e) { + logger.warn("Failed repair Sandbox", e); + } + }); + } + + ApplicationManager.getApplication().invokeLater(() -> + VirtualFileManager.getInstance().syncRefresh() + ); } }); - } - - ApplicationManager.getApplication().invokeLater(() -> - VirtualFileManager.getInstance().syncRefresh() - ); + }).start(); } private void repairProjectFiles(@NotNull StudyNode node) { diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java index ad8d8f86..19bef749 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java @@ -1,7 +1,6 @@ package com.jetbrains.tmp.learning.courseFormat; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; @@ -27,11 +26,8 @@ public class CourseNode extends Node { public CourseNode() { } - public CourseNode( - @NotNull Project project, - @NotNull Course data, - @Nullable ProgressIndicator indicator) { - super(project, data, indicator); + public CourseNode(@NotNull Project project, @NotNull Course data) { + super(project, data); } @Override @@ -57,18 +53,9 @@ protected List
    getChildDataList() { } @Override - public void init( - @NotNull Project project, - @Nullable StudyNode parent, - @Nullable ProgressIndicator indicator) { - if (indicator != null) { - indicator.setText("Refresh " + getName()); - indicator.setText2("Update sections"); - } - + public void init(@NotNull Project project, @Nullable StudyNode parent) { authors = null; - - super.init(project, parent, indicator); + super.init(project, parent); } @Override diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java index 3bbaa84a..a2962873 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java @@ -1,7 +1,6 @@ package com.jetbrains.tmp.learning.courseFormat; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.core.EduNames; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; @@ -28,11 +27,8 @@ public class LessonNode extends Node getChildDataList() { } @Override - public void init( - @NotNull Project project, - @Nullable StudyNode parent, - @Nullable ProgressIndicator indicator) { - if (indicator != null) { - indicator.setText("Refresh a lesson: " + getName()); - indicator.setText2("Update steps"); - } - + public void init(@NotNull Project project, @Nullable StudyNode parent) { courseId = 0; - - super.init(project, parent, indicator); + super.init(project, parent); } @Override diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java index 6571de86..ca650cd2 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java @@ -2,7 +2,6 @@ import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import com.thoughtworks.xstream.annotations.XStreamOmitField; @@ -32,6 +31,7 @@ public abstract class Node< DC extends StudyObject, CC extends Node> implements StudyNode { private static final Logger logger = Logger.getInstance(Node.class); + private static final ExecutorService executor = Executors.newSingleThreadExecutor(); private StudyNode parent; private D data; private List children; @@ -40,14 +40,22 @@ public abstract class Node< private volatile StudyStatus status; @XStreamOmitField private Project project; - private static final ExecutorService executor = Executors.newSingleThreadExecutor(); Node() { } - Node(@NotNull Project project, @NotNull D data, @Nullable ProgressIndicator indicator) { + Node(@NotNull Project project, @NotNull D data) { setData(data); - init(project, null, indicator); + init(project, null); + } + + @Nullable + public Project getProject() { + return project; + } + + public void setProject(@NotNull Project project) { + this.project = project; } @Nullable @@ -200,7 +208,7 @@ public List getChildren() { protected abstract List getChildDataList(); @Override - public void init(@NotNull Project project, @Nullable StudyNode parent, @Nullable ProgressIndicator indicator) { + public void init(@NotNull Project project, @Nullable StudyNode parent) { this.project = project; Map mapNodes = getMapNodes(); List needInit = getChildren(); @@ -221,7 +229,7 @@ public void init(@NotNull Project project, @Nullable StudyNode parent, @Nullable } item.setData(data); item.setWasDeleted(wasDeleted); - item.init(project, this, indicator); + item.init(project, this); if (item.canBeLeaf() || !item.isLeaf()) { getChildren().add(item); } @@ -232,7 +240,7 @@ public void init(@NotNull Project project, @Nullable StudyNode parent, @Nullable setParent(parent); for (StudyNode child : needInit) { - child.init(project, this, indicator); + child.init(project, this); } } @@ -241,9 +249,9 @@ private void setChildrenDeletedFlag() { } @Override - public void reloadData(@NotNull Project project, @Nullable ProgressIndicator indicator) { + public void reloadData(@NotNull Project project) { loadData(data.getId()); - init(project, indicator); + init(project); } protected abstract void loadData(long id); diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java index d3741bd7..9ca2e343 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java @@ -1,12 +1,10 @@ package com.jetbrains.tmp.learning.courseFormat; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.core.EduNames; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; import org.stepik.api.exceptions.StepikClientException; import org.stepik.api.objects.lessons.CompoundUnitLesson; @@ -32,24 +30,8 @@ public class SectionNode extends Node { public StepNode() {} - public StepNode( - @NotNull Project project, - @NotNull Step data, - @Nullable ProgressIndicator indicator) { - super(project, data, indicator); + public StepNode(@NotNull Project project, @NotNull Step data) { + super(project, data); } @Override - public void init( - @NotNull Project project, - @Nullable StudyNode parent, - @Nullable ProgressIndicator indicator) { - if (indicator != null) { - indicator.setText("Refresh a step: " + getName()); - indicator.setText2(""); - } - + public void init(@NotNull Project project, @Nullable StudyNode parent) { supportedLanguages = null; courseId = 0; - super.init(project, parent, indicator); + super.init(project, parent); } @Override diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java index 1c638b36..6b60dc5a 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java @@ -1,6 +1,5 @@ package com.jetbrains.tmp.learning.courseFormat; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,18 +54,15 @@ public interface StudyNode { void setData(@Nullable D data); - void init( - @NotNull Project project, - @Nullable final StudyNode parent, - @Nullable ProgressIndicator indicator); + void init(@NotNull Project project, @Nullable final StudyNode parent); - default void init(@NotNull Project project, @Nullable ProgressIndicator indicator) { - init(project, null, indicator); + default void init(@NotNull Project project) { + init(project, null); } boolean canBeLeaf(); - void reloadData(@NotNull Project project, @Nullable ProgressIndicator indicator); + void reloadData(@NotNull Project project); boolean getWasDeleted(); @@ -77,4 +73,9 @@ default void init(@NotNull Project project, @Nullable ProgressIndicator indicato void setRawStatus(@Nullable StudyStatus status); void passed(); + + @Nullable + Project getProject(); + + void setProject(@NotNull Project project); } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java index 14ea17dd..5723d000 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java @@ -1,9 +1,7 @@ package com.jetbrains.tmp.learning.courseFormat; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.stepik.api.objects.StudyObject; import org.stepik.api.objects.courses.Course; import org.stepik.api.objects.lessons.CompoundUnitLesson; @@ -15,22 +13,19 @@ * @author meanmail */ public class StudyNodeFactory { - public static StudyNode createTree( - @NotNull Project project, - @NotNull StudyObject data, - @Nullable ProgressIndicator indicator) { + public static StudyNode createTree(@NotNull Project project, @NotNull StudyObject data) { StudyNode root = null; if (data instanceof Course) { - root = new CourseNode(project, (Course) data, indicator); + root = new CourseNode(project, (Course) data); } else if (data instanceof Section) { - root = new SectionNode(project, (Section) data, indicator); + root = new SectionNode(project, (Section) data); } else if (data instanceof Lesson) { CompoundUnitLesson compoundData = new CompoundUnitLesson(null, (Lesson) data); - root = new LessonNode(project, compoundData, indicator); + root = new LessonNode(project, compoundData); } else if (data instanceof CompoundUnitLesson) { - root = new LessonNode(project, (CompoundUnitLesson) data, indicator); + root = new LessonNode(project, (CompoundUnitLesson) data); } else if (data instanceof Step) { - root = new StepNode(project, (Step) data, indicator); + root = new StepNode(project, (Step) data); } return root; } diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java index b75e6729..5a195e81 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java @@ -39,6 +39,8 @@ import java.awt.event.ActionListener; import java.util.Comparator; import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import static com.jetbrains.tmp.learning.StudyUtils.getChoiceStepText; import static com.jetbrains.tmp.learning.StudyUtils.getCodeStepText; @@ -53,6 +55,7 @@ import static com.jetbrains.tmp.learning.StudyUtils.getTextStepText; import static com.jetbrains.tmp.learning.StudyUtils.getUnknownStepText; import static com.jetbrains.tmp.learning.StudyUtils.getVideoStepText; +import static com.jetbrains.tmp.learning.courseFormat.StepType.CODE; import static com.jetbrains.tmp.learning.courseFormat.StepType.TEXT; import static com.jetbrains.tmp.learning.courseFormat.StepType.VIDEO; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; @@ -62,9 +65,9 @@ public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvid private static final String STEP_INFO_ID = "stepInfo"; private static final String EMPTY_STEP_TEXT = "Please, open any step to see step description"; private static final String VIDEO_QUALITY_PROPERTY_NAME = PLUGIN_ID + ".VIDEO_QUALITY"; + private static final ExecutorService executor = Executors.newSingleThreadExecutor(); private final JComboBox languageBox; private final JComboBox videoQualityBox; - private final JBCardLayout cardLayout; private final JPanel contentPanel; private final OnePixelSplitter splitPane; @@ -83,7 +86,7 @@ public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvid languageBox = new JComboBox<>(); languageBox.addActionListener(this); - qualityListener = e -> setText(); + qualityListener = e -> setText(stepNode); videoQualityBox = new JComboBox<>(); layout = new CardLayout(); @@ -197,20 +200,22 @@ public void setStepNode(@Nullable StudyNode studyNode, boolean force) { stepNode = (StepNode) studyNode; - setText(); + executor.execute(() -> setText(stepNode)); } - private void setText() { + private void setText(@Nullable StepNode stepNode) { if (stepNode == null) { setText(EMPTY_STEP_TEXT); rightPanel.setVisible(false); return; } String text; - boolean rightPanelVisible = false; StepType stepType = stepNode.getType(); + if (stepType != VIDEO && stepType != CODE) { + SwingUtilities.invokeLater(() -> rightPanel.setVisible(false)); + } boolean theory = stepType == VIDEO || stepType == TEXT; - postView(theory); + postView(stepNode, theory); switch (stepType) { case UNKNOWN: @@ -218,13 +223,16 @@ private void setText() { break; case CODE: text = getCodeStepText(stepNode); - languageBox.removeAllItems(); - stepNode.getSupportedLanguages().stream() - .sorted(Comparator.comparingInt(Enum::ordinal)) - .forEach(languageBox::addItem); - layout.show(rightPanel, "language"); - rightPanelVisible = languageBox.getModel().getSize() != 0; - languageBox.setSelectedItem(stepNode.getCurrentLang()); + SwingUtilities.invokeLater(() -> { + languageBox.removeAllItems(); + stepNode.getSupportedLanguages().stream() + .sorted(Comparator.comparingInt(Enum::ordinal)) + .forEach(languageBox::addItem); + layout.show(rightPanel, "language"); + boolean rightPanelVisible = languageBox.getModel().getSize() != 0; + rightPanel.setVisible(rightPanelVisible); + languageBox.setSelectedItem(stepNode.getCurrentLang()); + }); break; case TEXT: text = getTextStepText(stepNode); @@ -232,15 +240,18 @@ private void setText() { case VIDEO: VideoStepNodeHelper videoStepNode = stepNode.asVideoStep(); text = getVideoStepText(videoStepNode, getVideoQuality()); - videoQualityBox.removeActionListener(qualityListener); - videoQualityBox.removeAllItems(); - videoStepNode.getQualitySet().forEach(videoQualityBox::addItem); - int quality = videoStepNode.getQuality(); - videoQualityBox.setSelectedItem(quality); - videoQualityBox.addActionListener(qualityListener); - layout.show(rightPanel, "quality"); - rightPanelVisible = videoQualityBox.getModel().getSize() != 0; - storeVideoQuality(quality); + SwingUtilities.invokeLater(() -> { + videoQualityBox.removeActionListener(qualityListener); + videoQualityBox.removeAllItems(); + videoStepNode.getQualitySet().forEach(videoQualityBox::addItem); + int quality = videoStepNode.getQuality(); + storeVideoQuality(quality); + videoQualityBox.setSelectedItem(quality); + videoQualityBox.addActionListener(qualityListener); + layout.show(rightPanel, "quality"); + boolean rightPanelVisible = videoQualityBox.getModel().getSize() != 0; + rightPanel.setVisible(rightPanelVisible); + }); break; case CHOICE: text = getChoiceStepText(stepNode); @@ -274,16 +285,13 @@ private void setText() { break; } - rightPanel.setVisible(rightPanelVisible); setText(text); - ProjectView.getInstance(project).refresh(); } - private void postView(boolean needPassed) { - StepNode finalStepNode = stepNode; - new Thread(() -> { - Long assignment = finalStepNode.getAssignment(); - long stepId = finalStepNode.getId(); + private void postView(@NotNull StepNode stepNode, boolean needPassed) { + executor.execute(() -> { + Long assignment = stepNode.getAssignment(); + long stepId = stepNode.getId(); try { if (assignment != 0) { StepikApiClient stepikApiClient = StepikConnectorLogin.authAndGetStepikApiClient(); @@ -298,9 +306,14 @@ private void postView(boolean needPassed) { } if (needPassed) { - finalStepNode.passed(); + stepNode.passed(); + } + + if (stepNode.getProject() == null) { + stepNode.setProject(project); } - }).run(); + ProjectView.getInstance(project).refresh(); + }); } private int loadVideoQuality() { diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java b/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java index 996aea94..1ad7ddba 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java @@ -129,7 +129,7 @@ public void createCourseNodeUnderProgress(@NotNull final Project project, @NotNu ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); indicator.setIndeterminate(true); - projectRoot = StudyNodeFactory.createTree(project, data, indicator); + projectRoot = StudyNodeFactory.createTree(project, data); }, "Creating project", true, project); } diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java index bebea00f..f2e139ed 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java @@ -41,29 +41,26 @@ public StudyObject getElementAt(int index) { } void update(@NotNull SupportedLanguages programmingLanguage) { - executor.execute(new Runnable() { - @Override - public void run() { - List newCourseList = StepikProjectGenerator.getCourses(programmingLanguage); - - StudyObject selectedCourse = getSelectedItem(); - courses.clear(); - - if (!newCourseList.isEmpty()) { - courses.addAll(newCourseList); - if (selectedCourse == EMPTY_STUDY_OBJECT || !courses.contains(selectedCourse)) { - selectedCourse = courses.get(0); - } - } else { - courses.add(EMPTY_STUDY_OBJECT); - } + executor.execute(() -> { + List newCourseList = StepikProjectGenerator.getCourses(programmingLanguage); + + StudyObject selectedCourse = getSelectedItem(); + courses.clear(); - StudyObject finalSelectedCourse = selectedCourse; - SwingUtilities.invokeLater(() -> { - setSelectedItem(finalSelectedCourse); - fireIntervalAdded(this, 0, getSize() - 1); - }); + if (!newCourseList.isEmpty()) { + courses.addAll(newCourseList); + if (selectedCourse == EMPTY_STUDY_OBJECT || !courses.contains(selectedCourse)) { + selectedCourse = courses.get(0); + } + } else { + courses.add(EMPTY_STUDY_OBJECT); } + + StudyObject finalSelectedCourse = selectedCourse; + SwingUtilities.invokeLater(() -> { + setSelectedItem(finalSelectedCourse); + fireIntervalAdded(this, 0, getSize() - 1); + }); }); } diff --git a/stepik-union/src/main/java/org/stepik/plugin/utils/PresentationDataUtils.java b/stepik-union/src/main/java/org/stepik/plugin/utils/PresentationDataUtils.java index 3f8f86da..1a8daf51 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/utils/PresentationDataUtils.java +++ b/stepik-union/src/main/java/org/stepik/plugin/utils/PresentationDataUtils.java @@ -46,14 +46,18 @@ public static void updatePresentationData(@NotNull PresentationData data, @NotNu StudyNode node = StudyUtils.getStudyNode(project, psiDirectory.getVirtualFile()); if (node != null && path.equals(node.getPath())) { - setAttributes(data, node); + setAttributes(project, data, node); } else { data.setPresentableText(valueName); } } - private static void setAttributes(@NotNull PresentationData data, @NotNull StudyNode item) { + private static void setAttributes( + @NotNull Project project, + @NotNull PresentationData data, + @NotNull StudyNode item) { String text = item.getName(); + item.setProject(project); StudyStatus status = item.getStatus(); JBColor color = getColor(status); Icon icon = getIcon(item, status); From 83d901cd9f5a48a8d74ba257a744415137e83b68 Mon Sep 17 00:00:00 2001 From: meanmail Date: Mon, 20 Mar 2017 15:21:17 +0700 Subject: [PATCH 42/55] Corrected setting 'wasDeleted' flag for async init --- .../tmp/learning/courseFormat/Node.java | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java index ca650cd2..e02c650a 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java @@ -210,44 +210,36 @@ public List getChildren() { @Override public void init(@NotNull Project project, @Nullable StudyNode parent) { this.project = project; + setParent(parent); Map mapNodes = getMapNodes(); - List needInit = getChildren(); - setChildrenDeletedFlag(); + List processed = new ArrayList<>(); for (DC data : getChildDataList()) { C child = mapNodes.get(data.getId()); - if (child != null) { - child.setData(data); - child.setWasDeleted(wasDeleted); - } else { - C item; + if (child == null) { try { - item = getChildClass().newInstance(); + child = getChildClass().newInstance(); + getChildren().add(child); } catch (InstantiationException | IllegalAccessException e) { logger.warn("Can't get new instance for child", e); break; } - item.setData(data); - item.setWasDeleted(wasDeleted); - item.init(project, this); - if (item.canBeLeaf() || !item.isLeaf()) { - getChildren().add(item); - } } + child.setData(data); + child.setWasDeleted(wasDeleted); + processed.add(child); } sortChildren(); - setParent(parent); + ArrayList wasDeletedList = new ArrayList<>(getChildren()); + wasDeletedList.removeAll(processed); + wasDeletedList.forEach(child -> child.setWasDeleted(true)); - for (StudyNode child : needInit) { + for (StudyNode child : getChildren()) { child.init(project, this); } } - private void setChildrenDeletedFlag() { - getChildren().forEach(child -> child.setWasDeleted(true)); - } - @Override public void reloadData(@NotNull Project project) { loadData(data.getId()); From 7acf40163ec146a093ae3b778932dc6747688b38 Mon Sep 17 00:00:00 2001 From: meanmail Date: Mon, 20 Mar 2017 16:16:31 +0700 Subject: [PATCH 43/55] Corrected auth in project wizard --- .../tmp/learning/stepik/StepikConnectorLogin.java | 8 ++++---- .../stepik/plugin/projectWizard/idea/JavaWizardStep.java | 4 +++- .../plugin/projectWizard/pycharm/PyCharmWizardStep.java | 4 ++-- .../stepik/plugin/projectWizard/ui/CourseListBox.java | 3 +-- .../plugin/projectWizard/ui/ProjectSettingsPanel.java | 9 ++++----- .../stepik/plugin/projectWizard/ui/RefreshButton.java | 7 ++----- 6 files changed, 16 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java index 95c13e50..94ef730b 100644 --- a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java @@ -36,11 +36,11 @@ public class StepikConnectorLogin { "&scope=write" + "&response_type=token"; - private static long getLastUser() { + private static synchronized long getLastUser() { return PropertiesComponent.getInstance().getOrInitLong(LAST_USER_PROPERTY_NAME, 0); } - private static void setLastUser(long userId) { + private static synchronized void setLastUser(long userId) { PropertiesComponent.getInstance().setValue(LAST_USER_PROPERTY_NAME, String.valueOf(userId)); } @@ -175,7 +175,7 @@ private static TokenInfo getTokenInfo(long userId, StepikApiClient client) { return authInfo; } - private static void setAuthInfo(long userId, @NotNull final TokenInfo tokenInfo) { + private static void setTokenInfo(long userId, @NotNull final TokenInfo tokenInfo) { String serviceName = StepikProjectManager.class.getName(); CredentialAttributes attributes = new CredentialAttributes(serviceName, String.valueOf(userId), @@ -220,7 +220,7 @@ public static StepikApiClient authAndGetStepikApiClient() { public static synchronized void logout() { stepikApiClient.setTokenInfo(null); long userId = getLastUser(); - setAuthInfo(userId, new TokenInfo()); + setTokenInfo(userId, new TokenInfo()); setLastUser(0); logger.info("Logout successfully"); } diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java b/core/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java index a93debf5..ff6e6cad 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java @@ -6,6 +6,7 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.SupportedLanguages; +import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.stepik.api.objects.StudyObject; import org.stepik.core.projectWizard.ProjectWizardUtils; @@ -25,7 +26,7 @@ class JavaWizardStep extends ModuleWizardStep { JavaWizardStep(@NotNull final StepikProjectGenerator generator, @NotNull Project project) { this.generator = generator; this.project = project; - panel = new ProjectSettingsPanel(project, true); + panel = new ProjectSettingsPanel(true); } @NotNull @@ -40,6 +41,7 @@ public void updateDataModel() { @Override public void updateStep() { + StepikConnectorLogin.authentication(); panel.updateStep(); valid = false; leaving = false; diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java b/core/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java index 659e2a92..20e0ddfd 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java @@ -19,9 +19,8 @@ class PyCharmWizardStep implements ProjectSettingListener { PyCharmWizardStep(@NotNull StepikPyProjectGenerator generator, @NotNull Project project) { this.generator = generator; - panel = new ProjectSettingsPanel(project, false); + panel = new ProjectSettingsPanel(false); panel.addListener(this); - panel.setLanguage(SupportedLanguages.PYTHON3); } @NotNull @@ -53,6 +52,7 @@ public void changed() { } void updateStep() { + panel.setLanguage(SupportedLanguages.PYTHON3); panel.updateStep(); } } \ No newline at end of file diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java index a3497725..dbee3b19 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java @@ -1,6 +1,5 @@ package org.stepik.plugin.projectWizard.ui; -import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.SupportedLanguages; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,7 +31,7 @@ void refresh(@NotNull SupportedLanguages programmingLanguage) { courseListModel.update(programmingLanguage); } - void refresh(@NotNull Project project) { + void refresh() { courseListModel.update(programmingLanguage); } diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java index f5212ba7..b16bfef5 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java @@ -1,7 +1,6 @@ package org.stepik.plugin.projectWizard.ui; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.project.Project; import com.jetbrains.tmp.learning.SupportedLanguages; import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; @@ -31,8 +30,8 @@ public class ProjectSettingsPanel implements ProjectSetting, HierarchyListener { private JButton logoutButton; private StudyObject selectedStudyObject = StepikProjectGenerator.EMPTY_STUDY_OBJECT; - public ProjectSettingsPanel(@NotNull Project project, boolean visibleLangBox) { - refreshListButton.setTarget(courseListComboBox, project); + public ProjectSettingsPanel(boolean visibleLangBox) { + refreshListButton.setTarget(courseListComboBox); courseListComboBox.setTarget(this); langComboBox.setTarget(this); @@ -59,9 +58,8 @@ public JPanel getComponent() { public void updateStep() { logger.info("Start updating settings"); - StepikConnectorLogin.authentication(); - setUsername(); courseListComboBox.refresh(langComboBox.getSelectedItem()); + setUsername(); logger.info("Updating settings is done"); } @@ -79,6 +77,7 @@ public void selectedStudyNode(@NotNull StudyObject studyObject) { // Scroll to top courseListDescription.setSelectionStart(0); courseListDescription.setSelectionEnd(0); + setUsername(); logger.info("Has selected the course: " + studyObject); notifyListeners(); } diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java b/core/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java index fa620033..6df3ebfe 100644 --- a/core/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java +++ b/core/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java @@ -1,7 +1,6 @@ package org.stepik.plugin.projectWizard.ui; import com.intellij.icons.AllIcons; -import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -12,15 +11,13 @@ */ public class RefreshButton extends JButton { private CourseListBox target; - private Project project; public RefreshButton() { setIcon(AllIcons.Actions.Refresh); } - void setTarget(@NotNull CourseListBox target, @NotNull Project project) { + void setTarget(@NotNull CourseListBox target) { this.target = target; - this.project = project; } @Override @@ -28,7 +25,7 @@ protected void fireActionPerformed(ActionEvent event) { super.fireActionPerformed(event); if (target != null) { - target.refresh(project); + target.refresh(); } } } From ddd39d03f3363a27118d31481546f7ada39b7fc8 Mon Sep 17 00:00:00 2001 From: meanmail Date: Tue, 21 Mar 2017 15:36:15 +0700 Subject: [PATCH 44/55] Moved all to 'stepik-union' module --- core/build.gradle | 30 ------------------ settings.gradle | 2 +- stepik-union/build.gradle | 14 ++------ .../tmp/learning/StepikProjectManager.java | 0 .../learning/StudyBasePluginConfigurator.java | 0 .../learning/StudyDocumentationManager.java | 0 .../tmp/learning/StudyPluginConfigurator.java | 0 .../tmp/learning/StudyProjectComponent.java | 0 .../jetbrains/tmp/learning/StudyUtils.java | 0 .../tmp/learning/SupportedLanguages.java | 0 .../actions/StudyActionWithShortcut.java | 0 .../jetbrains/tmp/learning/core/EduNames.java | 0 .../jetbrains/tmp/learning/core/EduUtils.java | 0 .../tmp/learning/courseFormat/CourseNode.java | 0 .../tmp/learning/courseFormat/LessonNode.java | 0 .../tmp/learning/courseFormat/Node.java | 0 .../learning/courseFormat/SectionNode.java | 0 .../tmp/learning/courseFormat/StepNode.java | 0 .../tmp/learning/courseFormat/StepType.java | 0 .../tmp/learning/courseFormat/StudyNode.java | 0 .../courseFormat/StudyNodeComparator.java | 0 .../courseFormat/StudyNodeFactory.java | 0 .../learning/courseFormat/StudyStatus.java | 0 .../stepHelpers/ChoiceStepNodeHelper.java | 0 .../stepHelpers/DatasetStepNodeHelper.java | 0 .../stepHelpers/MatchingStepNodeHelper.java | 0 .../stepHelpers/NumberStepNodeHelper.java | 0 .../stepHelpers/SortingStepNodeHelper.java | 0 .../courseFormat/stepHelpers/StepHelper.java | 0 .../stepHelpers/StringStepNodeHelper.java | 0 .../stepHelpers/TableStepNodeHelper.java | 0 .../stepHelpers/VideoStepNodeHelper.java | 0 .../serialization/SampleConverter.java | 0 .../StudySerializationUtils.java | 0 .../StudyUnrecognizedFormatException.java | 0 .../SupportedLanguagesConverter.java | 0 .../tmp/learning/stepik/EduStepikNames.java | 0 .../learning/stepik/StepikConnectorLogin.java | 0 .../learning/stepik/StepikUpdateSettings.java | 0 .../tmp/learning/ui/FormListener.java | 0 .../tmp/learning/ui/StudyBrowserWindow.java | 0 .../tmp/learning/ui/StudyCondition.java | 0 .../tmp/learning/ui/StudyToolWindow.java | 0 .../learning/ui/StudyToolWindowFactory.java | 0 .../src/main/java/icons/AllStepikIcons.java | 0 .../java/org/stepik/core/metrics/Metrics.java | 0 .../stepik/core/metrics/MetricsStatus.java | 0 .../projectWizard/ProjectWizardUtils.java | 0 .../org/stepik/core/templates/Templater.java | 0 .../org/stepik/core/utils/ModuleUtils.java | 0 .../org/stepik/core/utils/PluginUtils.java | 0 .../stepik/core/utils/PresentationUtils.java | 0 .../java/org/stepik/core/utils/Product.java | 0 .../org/stepik/core/utils/ProductGroup.java | 0 .../core/utils/ProgrammingLanguageUtils.java | 0 .../stepik/core/utils/ProjectFilesUtils.java | 0 .../java/org/stepik/core/utils/Utils.java | 0 .../stepik/plugin/actions/ActionUtils.java | 0 .../org/stepik/plugin/actions/SendAction.java | 0 .../org/stepik/plugin/auth/ui/AuthDialog.java | 0 .../projectWizard/StepikProjectGenerator.java | 0 .../idea/AbstractModuleBuilder.java | 0 .../idea/CourseModuleBuilder.java | 0 .../projectWizard/idea/JavaWizardStep.java | 0 .../idea/ModuleBuilderWithSrc.java | 0 .../idea/SandboxModuleBuilder.java | 0 .../projectWizard/idea/StepModuleBuilder.java | 0 .../projectWizard/idea/StepikModuleType.java | 0 .../pycharm/PyCharmWizardStep.java | 0 .../pycharm/StepikPyProjectGenerator.java | 0 .../ui/CourseDescriptionPane.java | 0 .../projectWizard/ui/CourseListBox.java | 0 .../projectWizard/ui/CourseListBoxEditor.java | 0 .../projectWizard/ui/CourseListModel.java | 0 .../projectWizard/ui/LanguageComboBox.java | 0 .../projectWizard/ui/ProjectSetting.java | 0 .../ui/ProjectSettingListener.java | 0 .../ui/ProjectSettingsPanel.form | 0 .../ui/ProjectSettingsPanel.java | 0 .../projectWizard/ui/RefreshButton.java | 0 .../stepik/plugin/utils/NavigationUtils.java | 0 .../java/org/stepik/plugin/utils/Utils.java | 0 .../resources/highlight/highlight.pack.js | 0 .../resources/highlight/styles/darcula.css | 0 .../main/resources/highlight/styles/idea.css | 0 .../resources/icons/projectTree/course.png | Bin .../resources/icons/projectTree/course@2x.png | Bin .../icons/projectTree/courseCorrect.png | Bin .../icons/projectTree/courseCorrect@2x.png | Bin .../resources/icons/projectTree/lesson.png | Bin .../resources/icons/projectTree/lesson@2x.png | Bin .../icons/projectTree/lessonCorrect.png | Bin .../icons/projectTree/lessonCorrect@2x.png | Bin .../resources/icons/projectTree/module.png | Bin .../resources/icons/projectTree/module@2x.png | Bin .../icons/projectTree/moduleCorrect.png | Bin .../icons/projectTree/moduleCorrect@2x.png | Bin .../resources/icons/projectTree/sandbox.png | Bin .../icons/projectTree/sandbox@2x.png | Bin .../resources/icons/projectTree/stepCode.png | Bin .../icons/projectTree/stepCode@2x.png | Bin .../icons/projectTree/stepCodeCorrect.png | Bin .../icons/projectTree/stepCodeCorrect@2x.png | Bin .../icons/projectTree/stepProblem.png | Bin .../icons/projectTree/stepProblem@2x.png | Bin .../icons/projectTree/stepProblemCorrect.png | Bin .../projectTree/stepProblemCorrect@2x.png | Bin .../resources/icons/projectTree/stepText.png | Bin .../icons/projectTree/stepText@2x.png | Bin .../icons/projectTree/stepTextCorrect.png | Bin .../icons/projectTree/stepTextCorrect@2x.png | Bin .../resources/icons/projectTree/stepVideo.png | Bin .../icons/projectTree/stepVideo@2x.png | Bin .../icons/projectTree/stepVideoCorrect.png | Bin .../icons/projectTree/stepVideoCorrect@2x.png | Bin .../src/main/resources/icons/stepikLogo.png | Bin .../main/resources/icons/stepikLogo@2x.png | Bin .../main/resources/icons/stepikLogoBig.png | Bin .../main/resources/icons/stepikLogoBig@2x.png | Bin .../main/resources/icons/stepikLogoSmall.png | Bin .../resources/icons/stepikLogoSmall@2x.png | Bin .../resources/icons/toolWindow/checkTask.png | Bin .../icons/toolWindow/checkTask@2x.png | Bin .../icons/toolWindow/resetTaskFile.png | Bin .../icons/toolWindow/resetTaskFile@2x.png | Bin .../resources/style/javaFXBrowserDarcula.css | 0 .../style/javaFXBrowserDarculaScrollBar.css | 0 .../style/javaFXBrowserScrollBar.css | 0 .../src/main/resources/templates/error.ftl | 0 .../main/resources/templates/quiz/arrows.ftl | 0 .../main/resources/templates/quiz/base.ftl | 0 .../resources/templates/quiz/base_sorting.ftl | 0 .../main/resources/templates/quiz/choice.ftl | 0 .../main/resources/templates/quiz/dataset.ftl | 0 .../resources/templates/quiz/fill-blanks.ftl | 0 .../resources/templates/quiz/matching.ftl | 0 .../main/resources/templates/quiz/math.ftl | 0 .../main/resources/templates/quiz/number.ftl | 0 .../main/resources/templates/quiz/sorting.ftl | 0 .../main/resources/templates/quiz/string.ftl | 0 .../main/resources/templates/quiz/table.ftl | 0 .../src/main/resources/templates/template.ftl | 0 .../learning/StudySerializationUtilsTest.java | 0 .../tmp/learning/SupportedLanguagesTest.java | 0 .../courseFormat/SerializationTest.java | 0 .../learning/courseFormat/StudyNodeTest.java | 0 .../test/java/org/stepik/core/TestUtils.java | 0 .../core/utils/PresentationDataUtilsTest.java | 0 .../core/utils/ProjectFilesUtilsTest.java | 0 .../org/stepik/plugin/utils/UtilsTest.java | 0 .../courseFormat/expectedCourseNode.xml | 0 .../courseFormat/expectedLessonNode.xml | 0 .../courseFormat/expectedSectionNode.xml | 0 .../courseFormat/expectedStepNode.xml | 0 .../com/jetbrains/tmp/learning/version1_4.xml | 0 .../com/jetbrains/tmp/learning/version2_0.xml | 0 .../com/jetbrains/tmp/learning/version2_1.xml | 0 .../com/jetbrains/tmp/learning/version2_2.xml | 0 .../com/jetbrains/tmp/learning/version2_3.xml | 0 .../com/jetbrains/tmp/learning/version2_4.xml | 0 .../com/jetbrains/tmp/learning/version3_1.xml | 0 .../com/jetbrains/tmp/learning/version3_2.xml | 0 .../com/jetbrains/tmp/learning/version3_3.xml | 0 .../com/jetbrains/tmp/learning/version3_4.xml | 0 .../com/jetbrains/tmp/learning/version4_1.xml | 0 .../com/jetbrains/tmp/learning/version4_2.xml | 0 .../com/jetbrains/tmp/learning/version4_3.xml | 0 .../com/jetbrains/tmp/learning/version4_4.xml | 0 168 files changed, 4 insertions(+), 42 deletions(-) delete mode 100644 core/build.gradle rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/StudyDocumentationManager.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/SupportedLanguages.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/actions/StudyActionWithShortcut.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/core/EduNames.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeComparator.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyStatus.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/ChoiceStepNodeHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/MatchingStepNodeHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/SortingStepNodeHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StringStepNodeHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/VideoStepNodeHelper.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/serialization/SampleConverter.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/serialization/StudySerializationUtils.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/serialization/StudyUnrecognizedFormatException.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/serialization/SupportedLanguagesConverter.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/ui/StudyCondition.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java (100%) rename {core => stepik-union}/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java (100%) rename {core => stepik-union}/src/main/java/icons/AllStepikIcons.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/metrics/Metrics.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/metrics/MetricsStatus.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/templates/Templater.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/utils/ModuleUtils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/utils/PluginUtils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/utils/PresentationUtils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/utils/Product.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/utils/ProductGroup.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/core/utils/Utils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/actions/ActionUtils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/actions/SendAction.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/idea/AbstractModuleBuilder.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/idea/ModuleBuilderWithSrc.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/idea/StepikModuleType.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/CourseDescriptionPane.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBoxEditor.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingListener.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.form (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/utils/NavigationUtils.java (100%) rename {core => stepik-union}/src/main/java/org/stepik/plugin/utils/Utils.java (100%) rename {core => stepik-union}/src/main/resources/highlight/highlight.pack.js (100%) rename {core => stepik-union}/src/main/resources/highlight/styles/darcula.css (100%) rename {core => stepik-union}/src/main/resources/highlight/styles/idea.css (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/course.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/course@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/courseCorrect.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/courseCorrect@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/lesson.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/lesson@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/lessonCorrect.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/lessonCorrect@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/module.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/module@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/moduleCorrect.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/moduleCorrect@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/sandbox.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/sandbox@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepCode.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepCode@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepCodeCorrect.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepCodeCorrect@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepProblem.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepProblem@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepProblemCorrect.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepProblemCorrect@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepText.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepText@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepTextCorrect.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepTextCorrect@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepVideo.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepVideo@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepVideoCorrect.png (100%) rename {core => stepik-union}/src/main/resources/icons/projectTree/stepVideoCorrect@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/stepikLogo.png (100%) rename {core => stepik-union}/src/main/resources/icons/stepikLogo@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/stepikLogoBig.png (100%) rename {core => stepik-union}/src/main/resources/icons/stepikLogoBig@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/stepikLogoSmall.png (100%) rename {core => stepik-union}/src/main/resources/icons/stepikLogoSmall@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/toolWindow/checkTask.png (100%) rename {core => stepik-union}/src/main/resources/icons/toolWindow/checkTask@2x.png (100%) rename {core => stepik-union}/src/main/resources/icons/toolWindow/resetTaskFile.png (100%) rename {core => stepik-union}/src/main/resources/icons/toolWindow/resetTaskFile@2x.png (100%) rename {core => stepik-union}/src/main/resources/style/javaFXBrowserDarcula.css (100%) rename {core => stepik-union}/src/main/resources/style/javaFXBrowserDarculaScrollBar.css (100%) rename {core => stepik-union}/src/main/resources/style/javaFXBrowserScrollBar.css (100%) rename {core => stepik-union}/src/main/resources/templates/error.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/arrows.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/base.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/base_sorting.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/choice.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/dataset.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/fill-blanks.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/matching.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/math.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/number.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/sorting.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/string.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/quiz/table.ftl (100%) rename {core => stepik-union}/src/main/resources/templates/template.ftl (100%) rename {core => stepik-union}/src/test/java/com/jetbrains/tmp/learning/StudySerializationUtilsTest.java (100%) rename {core => stepik-union}/src/test/java/com/jetbrains/tmp/learning/SupportedLanguagesTest.java (100%) rename {core => stepik-union}/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java (100%) rename {core => stepik-union}/src/test/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeTest.java (100%) rename {core => stepik-union}/src/test/java/org/stepik/core/TestUtils.java (100%) rename {core => stepik-union}/src/test/java/org/stepik/core/utils/PresentationDataUtilsTest.java (100%) rename {core => stepik-union}/src/test/java/org/stepik/core/utils/ProjectFilesUtilsTest.java (100%) rename {core => stepik-union}/src/test/java/org/stepik/plugin/utils/UtilsTest.java (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedCourseNode.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedLessonNode.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedSectionNode.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedStepNode.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version1_4.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version2_0.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version2_1.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version2_2.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version2_3.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version2_4.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version3_1.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version3_2.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version3_3.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version3_4.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version4_1.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version4_2.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version4_3.xml (100%) rename {core => stepik-union}/src/test/resources/com/jetbrains/tmp/learning/version4_4.xml (100%) diff --git a/core/build.gradle b/core/build.gradle deleted file mode 100644 index 6087fbb5..00000000 --- a/core/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -apply plugin: 'org.stepik.gradle.plugins.pycharm' -apply plugin: 'org.stepik.gradle.plugins.idea' -apply plugin: 'org.stepik.gradle.plugins.clion' - -intellij { - version = project.getProperties().get('ideaVersion') - sandboxDirectory = project.getProperties().get('ideaSandboxDir') - idePath = project.getProperties().get('ideaPath') -} - -pycharm { - version = project.getProperties().get('pyCharmVersion') - sandboxDirectory = project.getProperties().get('pyCharmSandboxDir') - idePath = project.getProperties().get('pyCharmPath') -} - -clion { - version = project.getProperties().get('cLionVersion') - sandboxDirectory = project.getProperties().get('cLionSandboxDir') - idePath = project.getProperties().get('cLionPath') -} - -dependencies { - compile project(":stepik-java-api") - compile 'org.freemarker:freemarker:2.3.23' - -} - -group 'org.stepik' -version "0.1" diff --git a/settings.gradle b/settings.gradle index 6ea9d3cc..548ceecc 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ rootProject.name = 'intellij-plugins' -include 'stepik-union', 'core', 'stepik-java-api' \ No newline at end of file +include 'stepik-union', 'stepik-java-api' \ No newline at end of file diff --git a/stepik-union/build.gradle b/stepik-union/build.gradle index df0f0c77..dc4352b5 100644 --- a/stepik-union/build.gradle +++ b/stepik-union/build.gradle @@ -1,6 +1,5 @@ apply plugin: 'org.stepik.gradle.plugins.pycharm' apply plugin: 'org.stepik.gradle.plugins.idea' -apply plugin: 'org.stepik.gradle.plugins.clion' intellij { version = project.getProperties().get('ideaVersion') @@ -14,18 +13,11 @@ pycharm { idePath = project.getProperties().get('pyCharmPath') } -clion { - version = project.getProperties().get('cLionVersion') - sandboxDirectory = project.getProperties().get('cLionSandboxDir') - idePath = project.getProperties().get('cLionPath') -} - dependencies { compile project(":stepik-java-api") - compile project(":core") + compile 'org.freemarker:freemarker:2.3.23' + } group 'org.stepik' -version project.getProperties().get('pluginVersion') ?: 'SNAPSHOT' - -defaultTasks "runIdea" \ No newline at end of file +version "0.1" diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyDocumentationManager.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyDocumentationManager.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/StudyDocumentationManager.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyDocumentationManager.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/SupportedLanguages.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/SupportedLanguages.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/SupportedLanguages.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/SupportedLanguages.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/actions/StudyActionWithShortcut.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/actions/StudyActionWithShortcut.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/actions/StudyActionWithShortcut.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/actions/StudyActionWithShortcut.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/core/EduNames.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduNames.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/core/EduNames.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduNames.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeComparator.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeComparator.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeComparator.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeComparator.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyStatus.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyStatus.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyStatus.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyStatus.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/ChoiceStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/ChoiceStepNodeHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/ChoiceStepNodeHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/ChoiceStepNodeHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/MatchingStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/MatchingStepNodeHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/MatchingStepNodeHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/MatchingStepNodeHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/SortingStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/SortingStepNodeHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/SortingStepNodeHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/SortingStepNodeHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StringStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StringStepNodeHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StringStepNodeHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StringStepNodeHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/VideoStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/VideoStepNodeHelper.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/VideoStepNodeHelper.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/VideoStepNodeHelper.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/serialization/SampleConverter.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SampleConverter.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/serialization/SampleConverter.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SampleConverter.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/serialization/StudySerializationUtils.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudySerializationUtils.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/serialization/StudySerializationUtils.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudySerializationUtils.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/serialization/StudyUnrecognizedFormatException.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudyUnrecognizedFormatException.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/serialization/StudyUnrecognizedFormatException.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudyUnrecognizedFormatException.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/serialization/SupportedLanguagesConverter.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SupportedLanguagesConverter.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/serialization/SupportedLanguagesConverter.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SupportedLanguagesConverter.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyCondition.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyCondition.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/ui/StudyCondition.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyCondition.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java diff --git a/core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java similarity index 100% rename from core/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java rename to stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java diff --git a/core/src/main/java/icons/AllStepikIcons.java b/stepik-union/src/main/java/icons/AllStepikIcons.java similarity index 100% rename from core/src/main/java/icons/AllStepikIcons.java rename to stepik-union/src/main/java/icons/AllStepikIcons.java diff --git a/core/src/main/java/org/stepik/core/metrics/Metrics.java b/stepik-union/src/main/java/org/stepik/core/metrics/Metrics.java similarity index 100% rename from core/src/main/java/org/stepik/core/metrics/Metrics.java rename to stepik-union/src/main/java/org/stepik/core/metrics/Metrics.java diff --git a/core/src/main/java/org/stepik/core/metrics/MetricsStatus.java b/stepik-union/src/main/java/org/stepik/core/metrics/MetricsStatus.java similarity index 100% rename from core/src/main/java/org/stepik/core/metrics/MetricsStatus.java rename to stepik-union/src/main/java/org/stepik/core/metrics/MetricsStatus.java diff --git a/core/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java b/stepik-union/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java similarity index 100% rename from core/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java rename to stepik-union/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java diff --git a/core/src/main/java/org/stepik/core/templates/Templater.java b/stepik-union/src/main/java/org/stepik/core/templates/Templater.java similarity index 100% rename from core/src/main/java/org/stepik/core/templates/Templater.java rename to stepik-union/src/main/java/org/stepik/core/templates/Templater.java diff --git a/core/src/main/java/org/stepik/core/utils/ModuleUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/ModuleUtils.java similarity index 100% rename from core/src/main/java/org/stepik/core/utils/ModuleUtils.java rename to stepik-union/src/main/java/org/stepik/core/utils/ModuleUtils.java diff --git a/core/src/main/java/org/stepik/core/utils/PluginUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/PluginUtils.java similarity index 100% rename from core/src/main/java/org/stepik/core/utils/PluginUtils.java rename to stepik-union/src/main/java/org/stepik/core/utils/PluginUtils.java diff --git a/core/src/main/java/org/stepik/core/utils/PresentationUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/PresentationUtils.java similarity index 100% rename from core/src/main/java/org/stepik/core/utils/PresentationUtils.java rename to stepik-union/src/main/java/org/stepik/core/utils/PresentationUtils.java diff --git a/core/src/main/java/org/stepik/core/utils/Product.java b/stepik-union/src/main/java/org/stepik/core/utils/Product.java similarity index 100% rename from core/src/main/java/org/stepik/core/utils/Product.java rename to stepik-union/src/main/java/org/stepik/core/utils/Product.java diff --git a/core/src/main/java/org/stepik/core/utils/ProductGroup.java b/stepik-union/src/main/java/org/stepik/core/utils/ProductGroup.java similarity index 100% rename from core/src/main/java/org/stepik/core/utils/ProductGroup.java rename to stepik-union/src/main/java/org/stepik/core/utils/ProductGroup.java diff --git a/core/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java similarity index 100% rename from core/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java rename to stepik-union/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java diff --git a/core/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java similarity index 100% rename from core/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java rename to stepik-union/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java diff --git a/core/src/main/java/org/stepik/core/utils/Utils.java b/stepik-union/src/main/java/org/stepik/core/utils/Utils.java similarity index 100% rename from core/src/main/java/org/stepik/core/utils/Utils.java rename to stepik-union/src/main/java/org/stepik/core/utils/Utils.java diff --git a/core/src/main/java/org/stepik/plugin/actions/ActionUtils.java b/stepik-union/src/main/java/org/stepik/plugin/actions/ActionUtils.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/actions/ActionUtils.java rename to stepik-union/src/main/java/org/stepik/plugin/actions/ActionUtils.java diff --git a/core/src/main/java/org/stepik/plugin/actions/SendAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/SendAction.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/actions/SendAction.java rename to stepik-union/src/main/java/org/stepik/plugin/actions/SendAction.java diff --git a/core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/stepik-union/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java rename to stepik-union/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/idea/AbstractModuleBuilder.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/AbstractModuleBuilder.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/idea/AbstractModuleBuilder.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/AbstractModuleBuilder.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/idea/ModuleBuilderWithSrc.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/ModuleBuilderWithSrc.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/idea/ModuleBuilderWithSrc.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/ModuleBuilderWithSrc.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/idea/StepikModuleType.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/StepikModuleType.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/idea/StepikModuleType.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/StepikModuleType.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseDescriptionPane.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseDescriptionPane.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseDescriptionPane.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseDescriptionPane.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBoxEditor.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBoxEditor.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBoxEditor.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBoxEditor.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingListener.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingListener.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingListener.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingListener.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.form b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.form similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.form rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.form diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java diff --git a/core/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java rename to stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/RefreshButton.java diff --git a/core/src/main/java/org/stepik/plugin/utils/NavigationUtils.java b/stepik-union/src/main/java/org/stepik/plugin/utils/NavigationUtils.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/utils/NavigationUtils.java rename to stepik-union/src/main/java/org/stepik/plugin/utils/NavigationUtils.java diff --git a/core/src/main/java/org/stepik/plugin/utils/Utils.java b/stepik-union/src/main/java/org/stepik/plugin/utils/Utils.java similarity index 100% rename from core/src/main/java/org/stepik/plugin/utils/Utils.java rename to stepik-union/src/main/java/org/stepik/plugin/utils/Utils.java diff --git a/core/src/main/resources/highlight/highlight.pack.js b/stepik-union/src/main/resources/highlight/highlight.pack.js similarity index 100% rename from core/src/main/resources/highlight/highlight.pack.js rename to stepik-union/src/main/resources/highlight/highlight.pack.js diff --git a/core/src/main/resources/highlight/styles/darcula.css b/stepik-union/src/main/resources/highlight/styles/darcula.css similarity index 100% rename from core/src/main/resources/highlight/styles/darcula.css rename to stepik-union/src/main/resources/highlight/styles/darcula.css diff --git a/core/src/main/resources/highlight/styles/idea.css b/stepik-union/src/main/resources/highlight/styles/idea.css similarity index 100% rename from core/src/main/resources/highlight/styles/idea.css rename to stepik-union/src/main/resources/highlight/styles/idea.css diff --git a/core/src/main/resources/icons/projectTree/course.png b/stepik-union/src/main/resources/icons/projectTree/course.png similarity index 100% rename from core/src/main/resources/icons/projectTree/course.png rename to stepik-union/src/main/resources/icons/projectTree/course.png diff --git a/core/src/main/resources/icons/projectTree/course@2x.png b/stepik-union/src/main/resources/icons/projectTree/course@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/course@2x.png rename to stepik-union/src/main/resources/icons/projectTree/course@2x.png diff --git a/core/src/main/resources/icons/projectTree/courseCorrect.png b/stepik-union/src/main/resources/icons/projectTree/courseCorrect.png similarity index 100% rename from core/src/main/resources/icons/projectTree/courseCorrect.png rename to stepik-union/src/main/resources/icons/projectTree/courseCorrect.png diff --git a/core/src/main/resources/icons/projectTree/courseCorrect@2x.png b/stepik-union/src/main/resources/icons/projectTree/courseCorrect@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/courseCorrect@2x.png rename to stepik-union/src/main/resources/icons/projectTree/courseCorrect@2x.png diff --git a/core/src/main/resources/icons/projectTree/lesson.png b/stepik-union/src/main/resources/icons/projectTree/lesson.png similarity index 100% rename from core/src/main/resources/icons/projectTree/lesson.png rename to stepik-union/src/main/resources/icons/projectTree/lesson.png diff --git a/core/src/main/resources/icons/projectTree/lesson@2x.png b/stepik-union/src/main/resources/icons/projectTree/lesson@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/lesson@2x.png rename to stepik-union/src/main/resources/icons/projectTree/lesson@2x.png diff --git a/core/src/main/resources/icons/projectTree/lessonCorrect.png b/stepik-union/src/main/resources/icons/projectTree/lessonCorrect.png similarity index 100% rename from core/src/main/resources/icons/projectTree/lessonCorrect.png rename to stepik-union/src/main/resources/icons/projectTree/lessonCorrect.png diff --git a/core/src/main/resources/icons/projectTree/lessonCorrect@2x.png b/stepik-union/src/main/resources/icons/projectTree/lessonCorrect@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/lessonCorrect@2x.png rename to stepik-union/src/main/resources/icons/projectTree/lessonCorrect@2x.png diff --git a/core/src/main/resources/icons/projectTree/module.png b/stepik-union/src/main/resources/icons/projectTree/module.png similarity index 100% rename from core/src/main/resources/icons/projectTree/module.png rename to stepik-union/src/main/resources/icons/projectTree/module.png diff --git a/core/src/main/resources/icons/projectTree/module@2x.png b/stepik-union/src/main/resources/icons/projectTree/module@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/module@2x.png rename to stepik-union/src/main/resources/icons/projectTree/module@2x.png diff --git a/core/src/main/resources/icons/projectTree/moduleCorrect.png b/stepik-union/src/main/resources/icons/projectTree/moduleCorrect.png similarity index 100% rename from core/src/main/resources/icons/projectTree/moduleCorrect.png rename to stepik-union/src/main/resources/icons/projectTree/moduleCorrect.png diff --git a/core/src/main/resources/icons/projectTree/moduleCorrect@2x.png b/stepik-union/src/main/resources/icons/projectTree/moduleCorrect@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/moduleCorrect@2x.png rename to stepik-union/src/main/resources/icons/projectTree/moduleCorrect@2x.png diff --git a/core/src/main/resources/icons/projectTree/sandbox.png b/stepik-union/src/main/resources/icons/projectTree/sandbox.png similarity index 100% rename from core/src/main/resources/icons/projectTree/sandbox.png rename to stepik-union/src/main/resources/icons/projectTree/sandbox.png diff --git a/core/src/main/resources/icons/projectTree/sandbox@2x.png b/stepik-union/src/main/resources/icons/projectTree/sandbox@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/sandbox@2x.png rename to stepik-union/src/main/resources/icons/projectTree/sandbox@2x.png diff --git a/core/src/main/resources/icons/projectTree/stepCode.png b/stepik-union/src/main/resources/icons/projectTree/stepCode.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepCode.png rename to stepik-union/src/main/resources/icons/projectTree/stepCode.png diff --git a/core/src/main/resources/icons/projectTree/stepCode@2x.png b/stepik-union/src/main/resources/icons/projectTree/stepCode@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepCode@2x.png rename to stepik-union/src/main/resources/icons/projectTree/stepCode@2x.png diff --git a/core/src/main/resources/icons/projectTree/stepCodeCorrect.png b/stepik-union/src/main/resources/icons/projectTree/stepCodeCorrect.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepCodeCorrect.png rename to stepik-union/src/main/resources/icons/projectTree/stepCodeCorrect.png diff --git a/core/src/main/resources/icons/projectTree/stepCodeCorrect@2x.png b/stepik-union/src/main/resources/icons/projectTree/stepCodeCorrect@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepCodeCorrect@2x.png rename to stepik-union/src/main/resources/icons/projectTree/stepCodeCorrect@2x.png diff --git a/core/src/main/resources/icons/projectTree/stepProblem.png b/stepik-union/src/main/resources/icons/projectTree/stepProblem.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepProblem.png rename to stepik-union/src/main/resources/icons/projectTree/stepProblem.png diff --git a/core/src/main/resources/icons/projectTree/stepProblem@2x.png b/stepik-union/src/main/resources/icons/projectTree/stepProblem@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepProblem@2x.png rename to stepik-union/src/main/resources/icons/projectTree/stepProblem@2x.png diff --git a/core/src/main/resources/icons/projectTree/stepProblemCorrect.png b/stepik-union/src/main/resources/icons/projectTree/stepProblemCorrect.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepProblemCorrect.png rename to stepik-union/src/main/resources/icons/projectTree/stepProblemCorrect.png diff --git a/core/src/main/resources/icons/projectTree/stepProblemCorrect@2x.png b/stepik-union/src/main/resources/icons/projectTree/stepProblemCorrect@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepProblemCorrect@2x.png rename to stepik-union/src/main/resources/icons/projectTree/stepProblemCorrect@2x.png diff --git a/core/src/main/resources/icons/projectTree/stepText.png b/stepik-union/src/main/resources/icons/projectTree/stepText.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepText.png rename to stepik-union/src/main/resources/icons/projectTree/stepText.png diff --git a/core/src/main/resources/icons/projectTree/stepText@2x.png b/stepik-union/src/main/resources/icons/projectTree/stepText@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepText@2x.png rename to stepik-union/src/main/resources/icons/projectTree/stepText@2x.png diff --git a/core/src/main/resources/icons/projectTree/stepTextCorrect.png b/stepik-union/src/main/resources/icons/projectTree/stepTextCorrect.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepTextCorrect.png rename to stepik-union/src/main/resources/icons/projectTree/stepTextCorrect.png diff --git a/core/src/main/resources/icons/projectTree/stepTextCorrect@2x.png b/stepik-union/src/main/resources/icons/projectTree/stepTextCorrect@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepTextCorrect@2x.png rename to stepik-union/src/main/resources/icons/projectTree/stepTextCorrect@2x.png diff --git a/core/src/main/resources/icons/projectTree/stepVideo.png b/stepik-union/src/main/resources/icons/projectTree/stepVideo.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepVideo.png rename to stepik-union/src/main/resources/icons/projectTree/stepVideo.png diff --git a/core/src/main/resources/icons/projectTree/stepVideo@2x.png b/stepik-union/src/main/resources/icons/projectTree/stepVideo@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepVideo@2x.png rename to stepik-union/src/main/resources/icons/projectTree/stepVideo@2x.png diff --git a/core/src/main/resources/icons/projectTree/stepVideoCorrect.png b/stepik-union/src/main/resources/icons/projectTree/stepVideoCorrect.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepVideoCorrect.png rename to stepik-union/src/main/resources/icons/projectTree/stepVideoCorrect.png diff --git a/core/src/main/resources/icons/projectTree/stepVideoCorrect@2x.png b/stepik-union/src/main/resources/icons/projectTree/stepVideoCorrect@2x.png similarity index 100% rename from core/src/main/resources/icons/projectTree/stepVideoCorrect@2x.png rename to stepik-union/src/main/resources/icons/projectTree/stepVideoCorrect@2x.png diff --git a/core/src/main/resources/icons/stepikLogo.png b/stepik-union/src/main/resources/icons/stepikLogo.png similarity index 100% rename from core/src/main/resources/icons/stepikLogo.png rename to stepik-union/src/main/resources/icons/stepikLogo.png diff --git a/core/src/main/resources/icons/stepikLogo@2x.png b/stepik-union/src/main/resources/icons/stepikLogo@2x.png similarity index 100% rename from core/src/main/resources/icons/stepikLogo@2x.png rename to stepik-union/src/main/resources/icons/stepikLogo@2x.png diff --git a/core/src/main/resources/icons/stepikLogoBig.png b/stepik-union/src/main/resources/icons/stepikLogoBig.png similarity index 100% rename from core/src/main/resources/icons/stepikLogoBig.png rename to stepik-union/src/main/resources/icons/stepikLogoBig.png diff --git a/core/src/main/resources/icons/stepikLogoBig@2x.png b/stepik-union/src/main/resources/icons/stepikLogoBig@2x.png similarity index 100% rename from core/src/main/resources/icons/stepikLogoBig@2x.png rename to stepik-union/src/main/resources/icons/stepikLogoBig@2x.png diff --git a/core/src/main/resources/icons/stepikLogoSmall.png b/stepik-union/src/main/resources/icons/stepikLogoSmall.png similarity index 100% rename from core/src/main/resources/icons/stepikLogoSmall.png rename to stepik-union/src/main/resources/icons/stepikLogoSmall.png diff --git a/core/src/main/resources/icons/stepikLogoSmall@2x.png b/stepik-union/src/main/resources/icons/stepikLogoSmall@2x.png similarity index 100% rename from core/src/main/resources/icons/stepikLogoSmall@2x.png rename to stepik-union/src/main/resources/icons/stepikLogoSmall@2x.png diff --git a/core/src/main/resources/icons/toolWindow/checkTask.png b/stepik-union/src/main/resources/icons/toolWindow/checkTask.png similarity index 100% rename from core/src/main/resources/icons/toolWindow/checkTask.png rename to stepik-union/src/main/resources/icons/toolWindow/checkTask.png diff --git a/core/src/main/resources/icons/toolWindow/checkTask@2x.png b/stepik-union/src/main/resources/icons/toolWindow/checkTask@2x.png similarity index 100% rename from core/src/main/resources/icons/toolWindow/checkTask@2x.png rename to stepik-union/src/main/resources/icons/toolWindow/checkTask@2x.png diff --git a/core/src/main/resources/icons/toolWindow/resetTaskFile.png b/stepik-union/src/main/resources/icons/toolWindow/resetTaskFile.png similarity index 100% rename from core/src/main/resources/icons/toolWindow/resetTaskFile.png rename to stepik-union/src/main/resources/icons/toolWindow/resetTaskFile.png diff --git a/core/src/main/resources/icons/toolWindow/resetTaskFile@2x.png b/stepik-union/src/main/resources/icons/toolWindow/resetTaskFile@2x.png similarity index 100% rename from core/src/main/resources/icons/toolWindow/resetTaskFile@2x.png rename to stepik-union/src/main/resources/icons/toolWindow/resetTaskFile@2x.png diff --git a/core/src/main/resources/style/javaFXBrowserDarcula.css b/stepik-union/src/main/resources/style/javaFXBrowserDarcula.css similarity index 100% rename from core/src/main/resources/style/javaFXBrowserDarcula.css rename to stepik-union/src/main/resources/style/javaFXBrowserDarcula.css diff --git a/core/src/main/resources/style/javaFXBrowserDarculaScrollBar.css b/stepik-union/src/main/resources/style/javaFXBrowserDarculaScrollBar.css similarity index 100% rename from core/src/main/resources/style/javaFXBrowserDarculaScrollBar.css rename to stepik-union/src/main/resources/style/javaFXBrowserDarculaScrollBar.css diff --git a/core/src/main/resources/style/javaFXBrowserScrollBar.css b/stepik-union/src/main/resources/style/javaFXBrowserScrollBar.css similarity index 100% rename from core/src/main/resources/style/javaFXBrowserScrollBar.css rename to stepik-union/src/main/resources/style/javaFXBrowserScrollBar.css diff --git a/core/src/main/resources/templates/error.ftl b/stepik-union/src/main/resources/templates/error.ftl similarity index 100% rename from core/src/main/resources/templates/error.ftl rename to stepik-union/src/main/resources/templates/error.ftl diff --git a/core/src/main/resources/templates/quiz/arrows.ftl b/stepik-union/src/main/resources/templates/quiz/arrows.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/arrows.ftl rename to stepik-union/src/main/resources/templates/quiz/arrows.ftl diff --git a/core/src/main/resources/templates/quiz/base.ftl b/stepik-union/src/main/resources/templates/quiz/base.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/base.ftl rename to stepik-union/src/main/resources/templates/quiz/base.ftl diff --git a/core/src/main/resources/templates/quiz/base_sorting.ftl b/stepik-union/src/main/resources/templates/quiz/base_sorting.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/base_sorting.ftl rename to stepik-union/src/main/resources/templates/quiz/base_sorting.ftl diff --git a/core/src/main/resources/templates/quiz/choice.ftl b/stepik-union/src/main/resources/templates/quiz/choice.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/choice.ftl rename to stepik-union/src/main/resources/templates/quiz/choice.ftl diff --git a/core/src/main/resources/templates/quiz/dataset.ftl b/stepik-union/src/main/resources/templates/quiz/dataset.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/dataset.ftl rename to stepik-union/src/main/resources/templates/quiz/dataset.ftl diff --git a/core/src/main/resources/templates/quiz/fill-blanks.ftl b/stepik-union/src/main/resources/templates/quiz/fill-blanks.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/fill-blanks.ftl rename to stepik-union/src/main/resources/templates/quiz/fill-blanks.ftl diff --git a/core/src/main/resources/templates/quiz/matching.ftl b/stepik-union/src/main/resources/templates/quiz/matching.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/matching.ftl rename to stepik-union/src/main/resources/templates/quiz/matching.ftl diff --git a/core/src/main/resources/templates/quiz/math.ftl b/stepik-union/src/main/resources/templates/quiz/math.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/math.ftl rename to stepik-union/src/main/resources/templates/quiz/math.ftl diff --git a/core/src/main/resources/templates/quiz/number.ftl b/stepik-union/src/main/resources/templates/quiz/number.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/number.ftl rename to stepik-union/src/main/resources/templates/quiz/number.ftl diff --git a/core/src/main/resources/templates/quiz/sorting.ftl b/stepik-union/src/main/resources/templates/quiz/sorting.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/sorting.ftl rename to stepik-union/src/main/resources/templates/quiz/sorting.ftl diff --git a/core/src/main/resources/templates/quiz/string.ftl b/stepik-union/src/main/resources/templates/quiz/string.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/string.ftl rename to stepik-union/src/main/resources/templates/quiz/string.ftl diff --git a/core/src/main/resources/templates/quiz/table.ftl b/stepik-union/src/main/resources/templates/quiz/table.ftl similarity index 100% rename from core/src/main/resources/templates/quiz/table.ftl rename to stepik-union/src/main/resources/templates/quiz/table.ftl diff --git a/core/src/main/resources/templates/template.ftl b/stepik-union/src/main/resources/templates/template.ftl similarity index 100% rename from core/src/main/resources/templates/template.ftl rename to stepik-union/src/main/resources/templates/template.ftl diff --git a/core/src/test/java/com/jetbrains/tmp/learning/StudySerializationUtilsTest.java b/stepik-union/src/test/java/com/jetbrains/tmp/learning/StudySerializationUtilsTest.java similarity index 100% rename from core/src/test/java/com/jetbrains/tmp/learning/StudySerializationUtilsTest.java rename to stepik-union/src/test/java/com/jetbrains/tmp/learning/StudySerializationUtilsTest.java diff --git a/core/src/test/java/com/jetbrains/tmp/learning/SupportedLanguagesTest.java b/stepik-union/src/test/java/com/jetbrains/tmp/learning/SupportedLanguagesTest.java similarity index 100% rename from core/src/test/java/com/jetbrains/tmp/learning/SupportedLanguagesTest.java rename to stepik-union/src/test/java/com/jetbrains/tmp/learning/SupportedLanguagesTest.java diff --git a/core/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java b/stepik-union/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java similarity index 100% rename from core/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java rename to stepik-union/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java diff --git a/core/src/test/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeTest.java b/stepik-union/src/test/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeTest.java similarity index 100% rename from core/src/test/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeTest.java rename to stepik-union/src/test/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeTest.java diff --git a/core/src/test/java/org/stepik/core/TestUtils.java b/stepik-union/src/test/java/org/stepik/core/TestUtils.java similarity index 100% rename from core/src/test/java/org/stepik/core/TestUtils.java rename to stepik-union/src/test/java/org/stepik/core/TestUtils.java diff --git a/core/src/test/java/org/stepik/core/utils/PresentationDataUtilsTest.java b/stepik-union/src/test/java/org/stepik/core/utils/PresentationDataUtilsTest.java similarity index 100% rename from core/src/test/java/org/stepik/core/utils/PresentationDataUtilsTest.java rename to stepik-union/src/test/java/org/stepik/core/utils/PresentationDataUtilsTest.java diff --git a/core/src/test/java/org/stepik/core/utils/ProjectFilesUtilsTest.java b/stepik-union/src/test/java/org/stepik/core/utils/ProjectFilesUtilsTest.java similarity index 100% rename from core/src/test/java/org/stepik/core/utils/ProjectFilesUtilsTest.java rename to stepik-union/src/test/java/org/stepik/core/utils/ProjectFilesUtilsTest.java diff --git a/core/src/test/java/org/stepik/plugin/utils/UtilsTest.java b/stepik-union/src/test/java/org/stepik/plugin/utils/UtilsTest.java similarity index 100% rename from core/src/test/java/org/stepik/plugin/utils/UtilsTest.java rename to stepik-union/src/test/java/org/stepik/plugin/utils/UtilsTest.java diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedCourseNode.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedCourseNode.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedCourseNode.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedCourseNode.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedLessonNode.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedLessonNode.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedLessonNode.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedLessonNode.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedSectionNode.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedSectionNode.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedSectionNode.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedSectionNode.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedStepNode.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedStepNode.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedStepNode.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/courseFormat/expectedStepNode.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version1_4.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version1_4.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version1_4.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version1_4.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version2_0.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_0.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version2_0.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_0.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version2_1.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_1.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version2_1.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_1.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version2_2.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_2.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version2_2.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_2.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version2_3.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_3.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version2_3.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_3.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version2_4.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_4.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version2_4.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version2_4.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version3_1.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version3_1.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version3_1.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version3_1.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version3_2.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version3_2.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version3_2.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version3_2.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version3_3.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version3_3.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version3_3.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version3_3.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version3_4.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version3_4.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version3_4.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version3_4.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version4_1.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version4_1.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version4_1.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version4_1.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version4_2.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version4_2.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version4_2.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version4_2.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version4_3.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version4_3.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version4_3.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version4_3.xml diff --git a/core/src/test/resources/com/jetbrains/tmp/learning/version4_4.xml b/stepik-union/src/test/resources/com/jetbrains/tmp/learning/version4_4.xml similarity index 100% rename from core/src/test/resources/com/jetbrains/tmp/learning/version4_4.xml rename to stepik-union/src/test/resources/com/jetbrains/tmp/learning/version4_4.xml From 1a3dc8ed4b1837422a67cc1fa75e99aad2f96dde Mon Sep 17 00:00:00 2001 From: meanmail Date: Tue, 21 Mar 2017 16:08:18 +0700 Subject: [PATCH 45/55] Minor refactoring --- gradle.properties | 2 +- .../jetbrains/tmp/learning/core/EduUtils.java | 26 ------------ .../stepHelpers/TableStepNodeHelper.java | 4 -- .../tmp/learning/stepik/EduStepikNames.java | 6 --- .../learning/stepik/StepikUpdateSettings.java | 41 ------------------- .../src/main/resources/META-INF/clion.xml | 3 -- .../src/main/resources/META-INF/plugin.xml | 2 - .../main/resources/templates/quiz/arrows.ftl | 3 ++ .../main/resources/templates/quiz/dataset.ftl | 2 + .../resources/templates/quiz/fill-blanks.ftl | 1 + .../resources/templates/quiz/matching.ftl | 3 ++ .../main/resources/templates/quiz/math.ftl | 1 + .../main/resources/templates/quiz/number.ftl | 1 + .../main/resources/templates/quiz/sorting.ftl | 4 ++ .../main/resources/templates/quiz/string.ftl | 1 + .../main/resources/templates/quiz/table.ftl | 1 + .../courseFormat/SerializationTest.java | 8 +++- 17 files changed, 25 insertions(+), 84 deletions(-) delete mode 100644 stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java delete mode 100644 stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java delete mode 100644 stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java delete mode 100644 stepik-union/src/main/resources/META-INF/clion.xml diff --git a/gradle.properties b/gradle.properties index 93e338b7..494d354a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,6 +16,6 @@ pyCharmVersion=163.8233.8 #pyCharmSandboxDir=build/pycharm-sandbox/ #pyCharmPath=/path/to/pycharm ### CLion ### -cLionVersion=2016.3 +#cLionVersion=2016.3 #cLionSandboxDir=build/clion-sandbox/ #cLionPath=/path/to/clion diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java deleted file mode 100644 index 0b493f5f..00000000 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduUtils.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.jetbrains.tmp.learning.core; - -import org.jetbrains.annotations.NotNull; - -public class EduUtils { - private EduUtils() { - } - - /** - * Gets id in directory names like "step1", "lesson2" - * - * @param dirName full name of directory - * @param prefix part of name without index - * @return id of object - */ - public static int parseDirName(@NotNull final String dirName, @NotNull final String prefix) { - if (!dirName.startsWith(prefix)) { - return -1; - } - try { - return Integer.parseInt(dirName.substring(prefix.length())); - } catch (NumberFormatException e) { - return -1; - } - } -} diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java index 8a611f44..27ca870f 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java +++ b/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java @@ -36,10 +36,6 @@ protected void onStartInit() { choices = new HashMap<>(); } - @Override - protected void onAttemptLoaded() { - } - @Override protected void onSubmissionLoaded() { tableChoices = reply.getTableChoices(); diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java deleted file mode 100644 index 051386bc..00000000 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/EduStepikNames.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.jetbrains.tmp.learning.stepik; - -public class EduStepikNames { - private static final String STEPIK_URL = "https://stepik.org"; - public static final String STEPIK_SIGN_IN_LINK = STEPIK_URL + "/registration?next=%2Fexplore%2Fcourses"; -} diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java b/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java deleted file mode 100644 index 372f8aea..00000000 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikUpdateSettings.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.jetbrains.tmp.learning.stepik; - -import com.intellij.openapi.components.PersistentStateComponent; -import com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.components.State; -import com.intellij.openapi.components.Storage; -import com.intellij.util.xmlb.XmlSerializerUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -@State(name = "StepikUpdateSettings", storages = @Storage("other.xml")) -public class StepikUpdateSettings implements PersistentStateComponent { - private long nextTimeCheck = 0; - - public StepikUpdateSettings() { - } - - @Nullable - public static StepikUpdateSettings getInstance() { - return ServiceManager.getService(StepikUpdateSettings.class); - } - - public long getNextTimeCheck() { - return nextTimeCheck; - } - - public void setNextTimeCheck(long timeChecked) { - nextTimeCheck = timeChecked; - } - - @Nullable - @Override - public StepikUpdateSettings getState() { - return this; - } - - @Override - public void loadState(@NotNull StepikUpdateSettings state) { - XmlSerializerUtil.copyBean(state, this); - } -} diff --git a/stepik-union/src/main/resources/META-INF/clion.xml b/stepik-union/src/main/resources/META-INF/clion.xml deleted file mode 100644 index 96fecf92..00000000 --- a/stepik-union/src/main/resources/META-INF/clion.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/stepik-union/src/main/resources/META-INF/plugin.xml b/stepik-union/src/main/resources/META-INF/plugin.xml index 6e307008..956cf01b 100644 --- a/stepik-union/src/main/resources/META-INF/plugin.xml +++ b/stepik-union/src/main/resources/META-INF/plugin.xml @@ -25,7 +25,6 @@ com.intellij.modules.lang com.intellij.modules.java com.intellij.modules.python - com.intellij.modules.clion @@ -61,6 +60,5 @@ - \ No newline at end of file diff --git a/stepik-union/src/main/resources/templates/quiz/arrows.ftl b/stepik-union/src/main/resources/templates/quiz/arrows.ftl index f11657f6..79dfd643 100644 --- a/stepik-union/src/main/resources/templates/quiz/arrows.ftl +++ b/stepik-union/src/main/resources/templates/quiz/arrows.ftl @@ -1,3 +1,6 @@ +<#-- @ftlvariable name="index" type="java.lang.Integer" --> +<#-- @ftlvariable name="count" type="java.lang.Integer" --> +
    <#if index != 0> diff --git a/stepik-union/src/main/resources/templates/quiz/dataset.ftl b/stepik-union/src/main/resources/templates/quiz/dataset.ftl index 127ee5a8..3ccb7962 100644 --- a/stepik-union/src/main/resources/templates/quiz/dataset.ftl +++ b/stepik-union/src/main/resources/templates/quiz/dataset.ftl @@ -1,3 +1,5 @@ +<#-- @ftlvariable name="status" type="java.lang.String" --> +<#-- @ftlvariable name="disabled" type="java.lang.String" --> <#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.DatasetStepNodeHelper" --> <#-- @ftlvariable name="text" type="java.lang.String" --> diff --git a/stepik-union/src/main/resources/templates/quiz/fill-blanks.ftl b/stepik-union/src/main/resources/templates/quiz/fill-blanks.ftl index 7811b087..81b9c1d7 100644 --- a/stepik-union/src/main/resources/templates/quiz/fill-blanks.ftl +++ b/stepik-union/src/main/resources/templates/quiz/fill-blanks.ftl @@ -1,3 +1,4 @@ +<#-- @ftlvariable name="disabled" type="java.lang.String" --> <#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper" --> <#-- @ftlvariable name="text" type="java.lang.String" --> diff --git a/stepik-union/src/main/resources/templates/quiz/matching.ftl b/stepik-union/src/main/resources/templates/quiz/matching.ftl index 50245504..7a60ea45 100644 --- a/stepik-union/src/main/resources/templates/quiz/matching.ftl +++ b/stepik-union/src/main/resources/templates/quiz/matching.ftl @@ -1,3 +1,6 @@ +<#-- @ftlvariable name="ordering" type="java.util.List" --> +<#-- @ftlvariable name="status" type="java.lang.String" --> +<#-- @ftlvariable name="index" type="java.lang.Integer" --> <#-- @ftlvariable name="option" type="org.stepik.api.objects.attempts.Pair" --> <#include "base_sorting.ftl"/> diff --git a/stepik-union/src/main/resources/templates/quiz/math.ftl b/stepik-union/src/main/resources/templates/quiz/math.ftl index f975f55e..9ad0611b 100644 --- a/stepik-union/src/main/resources/templates/quiz/math.ftl +++ b/stepik-union/src/main/resources/templates/quiz/math.ftl @@ -1,3 +1,4 @@ +<#-- @ftlvariable name="disabled" type="java.lang.String" --> <#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper" --> <#-- @ftlvariable name="text" type="java.lang.String" --> diff --git a/stepik-union/src/main/resources/templates/quiz/number.ftl b/stepik-union/src/main/resources/templates/quiz/number.ftl index a59c637b..49292353 100644 --- a/stepik-union/src/main/resources/templates/quiz/number.ftl +++ b/stepik-union/src/main/resources/templates/quiz/number.ftl @@ -1,3 +1,4 @@ +<#-- @ftlvariable name="disabled" type="java.lang.String" --> <#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper" --> <#-- @ftlvariable name="text" type="java.lang.String" --> diff --git a/stepik-union/src/main/resources/templates/quiz/sorting.ftl b/stepik-union/src/main/resources/templates/quiz/sorting.ftl index 24a58fe9..ac73223f 100644 --- a/stepik-union/src/main/resources/templates/quiz/sorting.ftl +++ b/stepik-union/src/main/resources/templates/quiz/sorting.ftl @@ -1,3 +1,7 @@ +<#-- @ftlvariable name="ordering" type="java.util.List" --> +<#-- @ftlvariable name="status" type="java.lang.String" --> +<#-- @ftlvariable name="index" type="java.lang.Integer" --> + <#include "base_sorting.ftl"/> <@sorting_quiz> <#list ordering as option> diff --git a/stepik-union/src/main/resources/templates/quiz/string.ftl b/stepik-union/src/main/resources/templates/quiz/string.ftl index 8ce06df3..2b8af3c5 100644 --- a/stepik-union/src/main/resources/templates/quiz/string.ftl +++ b/stepik-union/src/main/resources/templates/quiz/string.ftl @@ -1,3 +1,4 @@ +<#-- @ftlvariable name="disabled" type="java.lang.String" --> <#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.StringStepNodeHelper" --> <#-- @ftlvariable name="text" type="java.lang.String" --> diff --git a/stepik-union/src/main/resources/templates/quiz/table.ftl b/stepik-union/src/main/resources/templates/quiz/table.ftl index 56ed0302..57d2182d 100644 --- a/stepik-union/src/main/resources/templates/quiz/table.ftl +++ b/stepik-union/src/main/resources/templates/quiz/table.ftl @@ -1,3 +1,4 @@ +<#-- @ftlvariable name="disabled" type="java.lang.String" --> <#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.TableStepNodeHelper" --> <#-- @ftlvariable name="text" type="java.lang.String" --> diff --git a/stepik-union/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java b/stepik-union/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java index a45714e0..d86e2467 100644 --- a/stepik-union/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java +++ b/stepik-union/src/test/java/com/jetbrains/tmp/learning/courseFormat/SerializationTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import org.stepik.api.objects.lessons.CompoundUnitLesson; import org.stepik.api.objects.steps.Limit; +import org.stepik.api.objects.steps.Step; import org.stepik.core.TestUtils; import org.xml.sax.SAXException; @@ -13,6 +14,7 @@ import java.io.IOException; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; /** * @author meanmail @@ -35,6 +37,7 @@ public void serializeSectionNode() LessonNode lessonNode = new LessonNode(); lessonNode.setParent(node); CompoundUnitLesson data = lessonNode.getData(); + assertNotNull(data); data.getLesson(); data.getUnit(); node.getChildren().add(lessonNode); @@ -46,6 +49,7 @@ public void serializeLessonNode() throws IOException, SAXException, ParserConfigurationException, InstantiationException, IllegalAccessException { LessonNode node = new LessonNode(); CompoundUnitLesson data = node.getData(); + assertNotNull(data); data.getLesson(); data.getUnit(); serialize("LessonNode", node); @@ -60,7 +64,9 @@ public void serializeStepNode() Limit limit = new Limit(); limit.setMemory(256); limit.setTime(8); - node.getData().getBlock().getOptions().getLimits().put("Java 8", limit); + Step data = node.getData(); + assertNotNull(data); + data.getBlock().getOptions().getLimits().put("Java 8", limit); serialize("StepNode", node); } From 6d37175045e59046c9e6a86bf5da3a41bbaccc26 Mon Sep 17 00:00:00 2001 From: meanmail Date: Tue, 21 Mar 2017 16:16:25 +0700 Subject: [PATCH 46/55] Moved from com.jetbrains.tmp.learning to org.stepik.core --- .../stepik/core}/StepikProjectManager.java | 27 +++++----- .../core}/StudyBasePluginConfigurator.java | 4 +- .../core}/StudyDocumentationManager.java | 2 +- .../stepik/core}/StudyPluginConfigurator.java | 2 +- .../stepik/core}/StudyProjectComponent.java | 8 +-- .../stepik/core}/StudyUtils.java | 28 +++++----- .../stepik/core}/SupportedLanguages.java | 2 +- .../actions/StudyActionWithShortcut.java | 2 +- .../stepik/core}/core/EduNames.java | 2 +- .../stepik/core}/courseFormat/CourseNode.java | 6 +-- .../stepik/core}/courseFormat/LessonNode.java | 8 +-- .../stepik/core}/courseFormat/Node.java | 14 +++-- .../core}/courseFormat/SectionNode.java | 6 +-- .../stepik/core}/courseFormat/StepNode.java | 30 +++++------ .../stepik/core}/courseFormat/StepType.java | 2 +- .../stepik/core}/courseFormat/StudyNode.java | 2 +- .../courseFormat/StudyNodeComparator.java | 2 +- .../core}/courseFormat/StudyNodeFactory.java | 2 +- .../core}/courseFormat/StudyStatus.java | 2 +- .../stepHelpers/ChoiceStepNodeHelper.java | 4 +- .../stepHelpers/DatasetStepNodeHelper.java | 4 +- .../stepHelpers/MatchingStepNodeHelper.java | 4 +- .../stepHelpers/NumberStepNodeHelper.java | 4 +- .../stepHelpers/SortingStepNodeHelper.java | 4 +- .../courseFormat/stepHelpers/StepHelper.java | 8 +-- .../stepHelpers/StringStepNodeHelper.java | 4 +- .../stepHelpers/TableStepNodeHelper.java | 4 +- .../stepHelpers/VideoStepNodeHelper.java | 4 +- .../java/org/stepik/core/metrics/Metrics.java | 10 ++-- .../projectWizard/ProjectWizardUtils.java | 8 +-- .../core}/serialization/SampleConverter.java | 2 +- .../StudySerializationUtils.java | 2 +- .../StudyUnrecognizedFormatException.java | 2 +- .../SupportedLanguagesConverter.java | 6 +-- .../core}/stepik/StepikConnectorLogin.java | 4 +- .../stepik/core}/ui/FormListener.java | 14 ++--- .../stepik/core}/ui/StudyBrowserWindow.java | 18 +++---- .../stepik/core}/ui/StudyCondition.java | 2 +- .../stepik/core}/ui/StudyToolWindow.java | 54 +++++++++---------- .../core}/ui/StudyToolWindowFactory.java | 4 +- .../org/stepik/core/utils/ModuleUtils.java | 4 +- .../stepik/core/utils/PresentationUtils.java | 12 ++--- .../core/utils/ProgrammingLanguageUtils.java | 10 ++-- .../stepik/core/utils/ProjectFilesUtils.java | 8 +-- .../plugin/StepikPluginConfigurator.java | 4 +- .../org/stepik/plugin/actions/SendAction.java | 10 ++-- .../navigation/StepikNextStepAction.java | 2 +- .../navigation/StepikPreviousStepAction.java | 2 +- .../StepikStepNavigationAction.java | 4 +- .../actions/navigation/StudyNavigator.java | 2 +- .../navigation/StudyStepNavigationAction.java | 8 +-- .../actions/step/AbstractStepAction.java | 8 +-- .../actions/step/DownloadSubmission.java | 12 ++--- .../actions/step/InsertStepikDirectives.java | 10 ++-- .../actions/step/StepikJavaPostAction.java | 10 ++-- .../actions/step/StepikResetStepAction.java | 8 +-- .../org/stepik/plugin/auth/ui/AuthDialog.java | 2 +- .../collective/ui/StepikSettingsPanel.java | 4 +- .../NavBarModelExtensionUtils.java | 4 +- .../projectView/StepikDirectoryNode.java | 6 +-- .../StepikTreeStructureProvider.java | 2 +- .../projectWizard/StepikProjectGenerator.java | 10 ++-- .../idea/CourseModuleBuilder.java | 8 +-- .../projectWizard/idea/JavaWizardStep.java | 4 +- .../idea/SandboxModuleBuilder.java | 2 +- .../projectWizard/idea/StepModuleBuilder.java | 2 +- .../pycharm/PyCharmWizardStep.java | 2 +- .../pycharm/StepikPyProjectGenerator.java | 8 +-- .../projectWizard/ui/CourseListBox.java | 2 +- .../projectWizard/ui/CourseListModel.java | 2 +- .../projectWizard/ui/LanguageComboBox.java | 2 +- .../projectWizard/ui/ProjectSetting.java | 2 +- .../ui/ProjectSettingsPanel.java | 4 +- .../stepik/plugin/utils/DirectivesUtils.java | 2 +- .../stepik/plugin/utils/NavigationUtils.java | 6 +-- .../plugin/utils/PresentationDataUtils.java | 10 ++-- .../plugin/utils/ProjectPsiFilesUtils.java | 4 +- .../java/org/stepik/plugin/utils/Utils.java | 2 +- .../src/main/resources/META-INF/plugin.xml | 10 ++-- .../main/resources/templates/quiz/base.ftl | 2 +- .../resources/templates/quiz/base_sorting.ftl | 2 +- .../main/resources/templates/quiz/choice.ftl | 2 +- .../main/resources/templates/quiz/dataset.ftl | 2 +- .../resources/templates/quiz/fill-blanks.ftl | 2 +- .../main/resources/templates/quiz/math.ftl | 2 +- .../main/resources/templates/quiz/number.ftl | 2 +- .../main/resources/templates/quiz/string.ftl | 2 +- .../main/resources/templates/quiz/table.ftl | 2 +- .../learning/StudySerializationUtilsTest.java | 7 +-- .../tmp/learning/SupportedLanguagesTest.java | 41 +++++++------- .../courseFormat/SerializationTest.java | 7 ++- .../learning/courseFormat/StudyNodeTest.java | 4 ++ .../core/utils/PresentationDataUtilsTest.java | 2 +- .../core/utils/ProjectFilesUtilsTest.java | 2 +- .../plugin/utils/DirectivesUtilsTest.java | 2 +- 95 files changed, 311 insertions(+), 303 deletions(-) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/StepikProjectManager.java (94%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/StudyBasePluginConfigurator.java (94%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/StudyDocumentationManager.java (97%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/StudyPluginConfigurator.java (96%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/StudyProjectComponent.java (96%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/StudyUtils.java (92%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/SupportedLanguages.java (99%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/actions/StudyActionWithShortcut.java (92%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/core/EduNames.java (90%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/CourseNode.java (94%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/LessonNode.java (93%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/Node.java (96%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/SectionNode.java (95%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/StepNode.java (90%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/StepType.java (95%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/StudyNode.java (96%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/StudyNodeComparator.java (91%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/StudyNodeFactory.java (96%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/StudyStatus.java (91%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/ChoiceStepNodeHelper.java (92%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/DatasetStepNodeHelper.java (87%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/MatchingStepNodeHelper.java (93%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/NumberStepNodeHelper.java (87%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/SortingStepNodeHelper.java (92%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/StepHelper.java (96%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/StringStepNodeHelper.java (90%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/TableStepNodeHelper.java (95%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/courseFormat/stepHelpers/VideoStepNodeHelper.java (95%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/serialization/SampleConverter.java (96%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/serialization/StudySerializationUtils.java (99%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/serialization/StudyUnrecognizedFormatException.java (75%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/serialization/SupportedLanguagesConverter.java (78%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/stepik/StepikConnectorLogin.java (98%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/ui/FormListener.java (97%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/ui/StudyBrowserWindow.java (96%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/ui/StudyCondition.java (87%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/ui/StudyToolWindow.java (87%) rename stepik-union/src/main/java/{com/jetbrains/tmp/learning => org/stepik/core}/ui/StudyToolWindowFactory.java (93%) diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java b/stepik-union/src/main/java/org/stepik/core/StepikProjectManager.java similarity index 94% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java rename to stepik-union/src/main/java/org/stepik/core/StepikProjectManager.java index c0369a1e..afe87c3f 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StepikProjectManager.java +++ b/stepik-union/src/main/java/org/stepik/core/StepikProjectManager.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning; +package org.stepik.core; import com.google.gson.internal.LinkedTreeMap; import com.intellij.openapi.application.ApplicationManager; @@ -18,17 +18,17 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.jetbrains.tmp.learning.core.EduNames; -import com.jetbrains.tmp.learning.courseFormat.CourseNode; -import com.jetbrains.tmp.learning.courseFormat.LessonNode; -import com.jetbrains.tmp.learning.courseFormat.SectionNode; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.serialization.SampleConverter; -import com.jetbrains.tmp.learning.serialization.StudySerializationUtils; -import com.jetbrains.tmp.learning.serialization.StudyUnrecognizedFormatException; -import com.jetbrains.tmp.learning.serialization.SupportedLanguagesConverter; -import com.jetbrains.tmp.learning.ui.StudyToolWindow; +import org.stepik.core.core.EduNames; +import org.stepik.core.courseFormat.CourseNode; +import org.stepik.core.courseFormat.LessonNode; +import org.stepik.core.courseFormat.SectionNode; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.serialization.SampleConverter; +import org.stepik.core.serialization.StudySerializationUtils; +import org.stepik.core.serialization.StudyUnrecognizedFormatException; +import org.stepik.core.serialization.SupportedLanguagesConverter; +import org.stepik.core.ui.StudyToolWindow; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.XStreamException; import com.thoughtworks.xstream.annotations.XStreamOmitField; @@ -60,7 +60,6 @@ import java.io.OutputStreamWriter; import java.util.UUID; -import static com.jetbrains.tmp.learning.SupportedLanguages.INVALID; import static java.nio.charset.StandardCharsets.UTF_8; import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; @@ -84,7 +83,7 @@ public class StepikProjectManager implements PersistentStateComponent, private StudyNode selected; private boolean showHint = false; private long createdBy; - private SupportedLanguages defaultLang = INVALID; + private SupportedLanguages defaultLang = SupportedLanguages.INVALID; private int version = CURRENT_VERSION; private String uuid; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java b/stepik-union/src/main/java/org/stepik/core/StudyBasePluginConfigurator.java similarity index 94% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java rename to stepik-union/src/main/java/org/stepik/core/StudyBasePluginConfigurator.java index 1aecaa7f..525ba3c6 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyBasePluginConfigurator.java +++ b/stepik-union/src/main/java/org/stepik/core/StudyBasePluginConfigurator.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning; +package org.stepik.core; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.fileEditor.FileEditorManagerAdapter; @@ -6,7 +6,7 @@ import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import javax.swing.*; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyDocumentationManager.java b/stepik-union/src/main/java/org/stepik/core/StudyDocumentationManager.java similarity index 97% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyDocumentationManager.java rename to stepik-union/src/main/java/org/stepik/core/StudyDocumentationManager.java index 0263f591..24a109d3 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyDocumentationManager.java +++ b/stepik-union/src/main/java/org/stepik/core/StudyDocumentationManager.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.jetbrains.tmp.learning; +package org.stepik.core; import com.intellij.codeInsight.TargetElementUtil; import com.intellij.codeInsight.documentation.DocumentationManager; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java b/stepik-union/src/main/java/org/stepik/core/StudyPluginConfigurator.java similarity index 96% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java rename to stepik-union/src/main/java/org/stepik/core/StudyPluginConfigurator.java index 96895439..3d5fbc4e 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyPluginConfigurator.java +++ b/stepik-union/src/main/java/org/stepik/core/StudyPluginConfigurator.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning; +package org.stepik.core; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.extensions.ExtensionPointName; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java b/stepik-union/src/main/java/org/stepik/core/StudyProjectComponent.java similarity index 96% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java rename to stepik-union/src/main/java/org/stepik/core/StudyProjectComponent.java index 2e603efd..b97b9425 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyProjectComponent.java +++ b/stepik-union/src/main/java/org/stepik/core/StudyProjectComponent.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning; +package org.stepik.core; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.actionSystem.AnAction; @@ -18,9 +18,9 @@ import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.util.containers.hash.HashMap; -import com.jetbrains.tmp.learning.actions.StudyActionWithShortcut; -import com.jetbrains.tmp.learning.ui.StudyToolWindow; -import com.jetbrains.tmp.learning.ui.StudyToolWindowFactory; +import org.stepik.core.actions.StudyActionWithShortcut; +import org.stepik.core.ui.StudyToolWindow; +import org.stepik.core.ui.StudyToolWindowFactory; import javafx.application.Platform; import org.jetbrains.annotations.NotNull; import org.stepik.core.metrics.Metrics; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java b/stepik-union/src/main/java/org/stepik/core/StudyUtils.java similarity index 92% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java rename to stepik-union/src/main/java/org/stepik/core/StudyUtils.java index 17d96338..ab963208 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/StudyUtils.java +++ b/stepik-union/src/main/java/org/stepik/core/StudyUtils.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning; +package org.stepik.core; import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.projectView.ProjectViewNode; @@ -12,19 +12,19 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFileSystemItem; import com.intellij.ui.content.Content; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.ChoiceStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.DatasetStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.MatchingStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.SortingStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StringStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.TableStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.VideoStepNodeHelper; -import com.jetbrains.tmp.learning.ui.StudyToolWindow; -import com.jetbrains.tmp.learning.ui.StudyToolWindowFactory; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.courseFormat.stepHelpers.ChoiceStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.DatasetStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.MatchingStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.NumberStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.SortingStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.StepHelper; +import org.stepik.core.courseFormat.stepHelpers.StringStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.TableStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.VideoStepNodeHelper; +import org.stepik.core.ui.StudyToolWindow; +import org.stepik.core.ui.StudyToolWindowFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.objects.steps.Limit; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/SupportedLanguages.java b/stepik-union/src/main/java/org/stepik/core/SupportedLanguages.java similarity index 99% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/SupportedLanguages.java rename to stepik-union/src/main/java/org/stepik/core/SupportedLanguages.java index 17218541..f376040e 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/SupportedLanguages.java +++ b/stepik-union/src/main/java/org/stepik/core/SupportedLanguages.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning; +package org.stepik.core; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/actions/StudyActionWithShortcut.java b/stepik-union/src/main/java/org/stepik/core/actions/StudyActionWithShortcut.java similarity index 92% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/actions/StudyActionWithShortcut.java rename to stepik-union/src/main/java/org/stepik/core/actions/StudyActionWithShortcut.java index 8c1a1196..1ede2de9 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/actions/StudyActionWithShortcut.java +++ b/stepik-union/src/main/java/org/stepik/core/actions/StudyActionWithShortcut.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.actions; +package org.stepik.core.actions; import com.intellij.openapi.project.DumbAwareAction; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduNames.java b/stepik-union/src/main/java/org/stepik/core/core/EduNames.java similarity index 90% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduNames.java rename to stepik-union/src/main/java/org/stepik/core/core/EduNames.java index 4dee353b..516d1485 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/core/EduNames.java +++ b/stepik-union/src/main/java/org/stepik/core/core/EduNames.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.core; +package org.stepik.core.core; import org.jetbrains.annotations.NonNls; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/CourseNode.java similarity index 94% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/CourseNode.java index 19bef749..a4c70484 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/CourseNode.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/CourseNode.java @@ -1,8 +1,8 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; @@ -17,7 +17,7 @@ import java.util.Collections; import java.util.List; -import static com.jetbrains.tmp.learning.stepik.StepikConnectorLogin.authAndGetStepikApiClient; +import static org.stepik.core.stepik.StepikConnectorLogin.authAndGetStepikApiClient; public class CourseNode extends Node { private static final Logger logger = Logger.getInstance(CourseNode.class); diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/LessonNode.java similarity index 93% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/LessonNode.java index a2962873..93e28db7 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/LessonNode.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/LessonNode.java @@ -1,9 +1,9 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.core.EduNames; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.core.EduNames; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; @@ -18,7 +18,7 @@ import java.util.Collections; import java.util.List; -import static com.jetbrains.tmp.learning.stepik.StepikConnectorLogin.authAndGetStepikApiClient; +import static org.stepik.core.stepik.StepikConnectorLogin.authAndGetStepikApiClient; public class LessonNode extends Node { private static final Logger logger = Logger.getInstance(LessonNode.class); diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/Node.java similarity index 96% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/Node.java index e02c650a..f9c97491 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/Node.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/Node.java @@ -1,9 +1,9 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.stepik.StepikConnectorLogin; import com.thoughtworks.xstream.annotations.XStreamOmitField; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -20,8 +20,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import static com.jetbrains.tmp.learning.courseFormat.StudyStatus.SOLVED; - /** * @author meanmail */ @@ -293,7 +291,7 @@ public StudyStatus getStatus() { String id = progress.getId(); StudyNode node = progressMap.get(id); if (progress.isPassed()) { - node.setRawStatus(SOLVED); + node.setRawStatus(StudyStatus.SOLVED); } }); } @@ -310,8 +308,8 @@ public StudyStatus getStatus() { @Override public void setStatus(@Nullable StudyStatus status) { - if (status == SOLVED && this.status != status) { - this.status = SOLVED; + if (status == StudyStatus.SOLVED && this.status != status) { + this.status = StudyStatus.SOLVED; StudyNode parent = getParent(); @@ -329,7 +327,7 @@ public void setRawStatus(@Nullable StudyStatus status) { @Override public void passed() { - setStatus(SOLVED); + setStatus(StudyStatus.SOLVED); } @Nullable diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/SectionNode.java similarity index 95% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/SectionNode.java index 9ca2e343..deee5ff6 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/SectionNode.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/SectionNode.java @@ -1,9 +1,9 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.core.EduNames; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.core.EduNames; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.stepik.api.client.StepikApiClient; import org.stepik.api.exceptions.StepikClientException; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/StepNode.java similarity index 90% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/StepNode.java index 8604b5e1..ac0c66ed 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepNode.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/StepNode.java @@ -1,19 +1,19 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.core.EduNames; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.ChoiceStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.DatasetStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.MatchingStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.NumberStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.SortingStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.StringStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.TableStepNodeHelper; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.VideoStepNodeHelper; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.core.EduNames; +import org.stepik.core.courseFormat.stepHelpers.ChoiceStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.DatasetStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.MatchingStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.NumberStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.SortingStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.StepHelper; +import org.stepik.core.courseFormat.stepHelpers.StringStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.TableStepNodeHelper; +import org.stepik.core.courseFormat.stepHelpers.VideoStepNodeHelper; +import org.stepik.core.stepik.StepikConnectorLogin; import com.thoughtworks.xstream.annotations.XStreamOmitField; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -33,8 +33,8 @@ import java.util.List; import java.util.Map; -import static com.jetbrains.tmp.learning.SupportedLanguages.INVALID; -import static com.jetbrains.tmp.learning.stepik.StepikConnectorLogin.authAndGetStepikApiClient; +import static org.stepik.core.SupportedLanguages.INVALID; +import static org.stepik.core.stepik.StepikConnectorLogin.authAndGetStepikApiClient; public class StepNode extends Node { private static final Logger logger = Logger.getInstance(StepNode.class); diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/StepType.java similarity index 95% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/StepType.java index 848c4332..1e4f12e0 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StepType.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/StepType.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNode.java similarity index 96% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNode.java index 6b60dc5a..7f102fe2 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNode.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNode.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeComparator.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNodeComparator.java similarity index 91% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeComparator.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNodeComparator.java index 0a6d789c..f21ce921 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeComparator.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNodeComparator.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import java.util.Comparator; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNodeFactory.java similarity index 96% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNodeFactory.java index 5723d000..422603fe 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyNodeFactory.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/StudyNodeFactory.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyStatus.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/StudyStatus.java similarity index 91% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyStatus.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/StudyStatus.java index 7f134ee0..8921eb69 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/StudyStatus.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/StudyStatus.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.courseFormat; +package org.stepik.core.courseFormat; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/ChoiceStepNodeHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/ChoiceStepNodeHelper.java similarity index 92% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/ChoiceStepNodeHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/ChoiceStepNodeHelper.java index acc72e1e..dac4a897 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/ChoiceStepNodeHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/ChoiceStepNodeHelper.java @@ -1,7 +1,7 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; import com.intellij.openapi.util.Pair; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/DatasetStepNodeHelper.java similarity index 87% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/DatasetStepNodeHelper.java index 793a8503..8bc137ef 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/DatasetStepNodeHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/DatasetStepNodeHelper.java @@ -1,6 +1,6 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.apache.commons.lang.StringEscapeUtils; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/MatchingStepNodeHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/MatchingStepNodeHelper.java similarity index 93% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/MatchingStepNodeHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/MatchingStepNodeHelper.java index d093367e..bea77e94 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/MatchingStepNodeHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/MatchingStepNodeHelper.java @@ -1,7 +1,7 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; import com.intellij.openapi.util.Pair; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/NumberStepNodeHelper.java similarity index 87% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/NumberStepNodeHelper.java index 3c1743e5..b3357ff3 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/NumberStepNodeHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/NumberStepNodeHelper.java @@ -1,6 +1,6 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.apache.commons.lang.StringEscapeUtils; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/SortingStepNodeHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/SortingStepNodeHelper.java similarity index 92% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/SortingStepNodeHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/SortingStepNodeHelper.java index 59a90c7d..19b11fb4 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/SortingStepNodeHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/SortingStepNodeHelper.java @@ -1,7 +1,7 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; import com.intellij.openapi.util.Pair; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/StepHelper.java similarity index 96% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/StepHelper.java index 0b181bcb..9673b2cb 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StepHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/StepHelper.java @@ -1,9 +1,9 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; import com.intellij.openapi.diagnostic.Logger; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyStatus; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyStatus; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.stepik.api.client.StepikApiClient; import org.stepik.api.exceptions.StepikClientException; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StringStepNodeHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/StringStepNodeHelper.java similarity index 90% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StringStepNodeHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/StringStepNodeHelper.java index 5394670e..d033c209 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/StringStepNodeHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/StringStepNodeHelper.java @@ -1,6 +1,6 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.apache.commons.lang.StringEscapeUtils; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/TableStepNodeHelper.java similarity index 95% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/TableStepNodeHelper.java index 27ca870f..bbd409f4 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/TableStepNodeHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/TableStepNodeHelper.java @@ -1,6 +1,6 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.jetbrains.annotations.NotNull; import org.stepik.api.objects.submissions.Choice; import org.stepik.api.objects.submissions.Column; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/VideoStepNodeHelper.java b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/VideoStepNodeHelper.java similarity index 95% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/VideoStepNodeHelper.java rename to stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/VideoStepNodeHelper.java index 3c6bc69b..b0e6c830 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/courseFormat/stepHelpers/VideoStepNodeHelper.java +++ b/stepik-union/src/main/java/org/stepik/core/courseFormat/stepHelpers/VideoStepNodeHelper.java @@ -1,6 +1,6 @@ -package com.jetbrains.tmp.learning.courseFormat.stepHelpers; +package org.stepik.core.courseFormat.stepHelpers; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.objects.steps.Step; diff --git a/stepik-union/src/main/java/org/stepik/core/metrics/Metrics.java b/stepik-union/src/main/java/org/stepik/core/metrics/Metrics.java index 1d17f190..17a2a10b 100644 --- a/stepik-union/src/main/java/org/stepik/core/metrics/Metrics.java +++ b/stepik-union/src/main/java/org/stepik/core/metrics/Metrics.java @@ -3,11 +3,11 @@ import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StepType; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepType; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.stepik.api.client.StepikApiClient; import org.stepik.api.exceptions.StepikClientException; diff --git a/stepik-union/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java b/stepik-union/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java index 31cde4eb..ecc827b0 100644 --- a/stepik-union/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java +++ b/stepik-union/src/main/java/org/stepik/core/projectWizard/ProjectWizardUtils.java @@ -4,10 +4,10 @@ import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SampleConverter.java b/stepik-union/src/main/java/org/stepik/core/serialization/SampleConverter.java similarity index 96% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SampleConverter.java rename to stepik-union/src/main/java/org/stepik/core/serialization/SampleConverter.java index c4ae96f8..8d7eb64a 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SampleConverter.java +++ b/stepik-union/src/main/java/org/stepik/core/serialization/SampleConverter.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.serialization; +package org.stepik.core.serialization; import com.thoughtworks.xstream.converters.SingleValueConverter; import org.intellij.lang.annotations.Language; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudySerializationUtils.java b/stepik-union/src/main/java/org/stepik/core/serialization/StudySerializationUtils.java similarity index 99% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudySerializationUtils.java rename to stepik-union/src/main/java/org/stepik/core/serialization/StudySerializationUtils.java index aaf58e78..54adc885 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudySerializationUtils.java +++ b/stepik-union/src/main/java/org/stepik/core/serialization/StudySerializationUtils.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.serialization; +package org.stepik.core.serialization; import com.intellij.openapi.diagnostic.Logger; import org.jdom.Attribute; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudyUnrecognizedFormatException.java b/stepik-union/src/main/java/org/stepik/core/serialization/StudyUnrecognizedFormatException.java similarity index 75% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudyUnrecognizedFormatException.java rename to stepik-union/src/main/java/org/stepik/core/serialization/StudyUnrecognizedFormatException.java index a2a70e49..5e3316b2 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/StudyUnrecognizedFormatException.java +++ b/stepik-union/src/main/java/org/stepik/core/serialization/StudyUnrecognizedFormatException.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.serialization; +package org.stepik.core.serialization; public class StudyUnrecognizedFormatException extends Exception { StudyUnrecognizedFormatException(String message) { diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SupportedLanguagesConverter.java b/stepik-union/src/main/java/org/stepik/core/serialization/SupportedLanguagesConverter.java similarity index 78% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SupportedLanguagesConverter.java rename to stepik-union/src/main/java/org/stepik/core/serialization/SupportedLanguagesConverter.java index 2b705c30..1f764a79 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/serialization/SupportedLanguagesConverter.java +++ b/stepik-union/src/main/java/org/stepik/core/serialization/SupportedLanguagesConverter.java @@ -1,9 +1,9 @@ -package com.jetbrains.tmp.learning.serialization; +package org.stepik.core.serialization; -import com.jetbrains.tmp.learning.SupportedLanguages; +import org.stepik.core.SupportedLanguages; import com.thoughtworks.xstream.converters.SingleValueConverter; -import static com.jetbrains.tmp.learning.SupportedLanguages.INVALID; +import static org.stepik.core.SupportedLanguages.INVALID; public class SupportedLanguagesConverter implements SingleValueConverter { @Override diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java b/stepik-union/src/main/java/org/stepik/core/stepik/StepikConnectorLogin.java similarity index 98% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java rename to stepik-union/src/main/java/org/stepik/core/stepik/StepikConnectorLogin.java index 94ef730b..1948087c 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/stepik/StepikConnectorLogin.java +++ b/stepik-union/src/main/java/org/stepik/core/stepik/StepikConnectorLogin.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.stepik; +package org.stepik.core.stepik; import com.intellij.credentialStore.CredentialAttributes; import com.intellij.ide.passwordSafe.PasswordSafe; @@ -8,7 +8,7 @@ import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.net.HttpConfigurable; -import com.jetbrains.tmp.learning.StepikProjectManager; +import org.stepik.core.StepikProjectManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.client.HttpTransportClient; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java b/stepik-union/src/main/java/org/stepik/core/ui/FormListener.java similarity index 97% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java rename to stepik-union/src/main/java/org/stepik/core/ui/FormListener.java index b0768ba1..e07168f6 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/FormListener.java +++ b/stepik-union/src/main/java/org/stepik/core/ui/FormListener.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.ui; +package org.stepik.core.ui; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; @@ -6,12 +6,12 @@ import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyUtils; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StepType; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyUtils; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepType; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.stepik.StepikConnectorLogin; import javafx.stage.FileChooser; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java b/stepik-union/src/main/java/org/stepik/core/ui/StudyBrowserWindow.java similarity index 96% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java rename to stepik-union/src/main/java/org/stepik/core/ui/StudyBrowserWindow.java index 7a8976e0..d6abb781 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyBrowserWindow.java +++ b/stepik-union/src/main/java/org/stepik/core/ui/StudyBrowserWindow.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.ui; +package org.stepik.core.ui; import com.intellij.ide.BrowserUtil; import com.intellij.ide.ui.LafManager; @@ -12,14 +12,14 @@ import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyUtils; -import com.jetbrains.tmp.learning.courseFormat.CourseNode; -import com.jetbrains.tmp.learning.courseFormat.LessonNode; -import com.jetbrains.tmp.learning.courseFormat.SectionNode; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyUtils; +import org.stepik.core.courseFormat.CourseNode; +import org.stepik.core.courseFormat.LessonNode; +import org.stepik.core.courseFormat.SectionNode; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.stepik.StepikConnectorLogin; import javafx.application.Platform; import javafx.concurrent.Worker; import javafx.embed.swing.JFXPanel; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyCondition.java b/stepik-union/src/main/java/org/stepik/core/ui/StudyCondition.java similarity index 87% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyCondition.java rename to stepik-union/src/main/java/org/stepik/core/ui/StudyCondition.java index e86f2c87..9413bbbe 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyCondition.java +++ b/stepik-union/src/main/java/org/stepik/core/ui/StudyCondition.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.ui; +package org.stepik.core.ui; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.util.Condition; diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java b/stepik-union/src/main/java/org/stepik/core/ui/StudyToolWindow.java similarity index 87% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java rename to stepik-union/src/main/java/org/stepik/core/ui/StudyToolWindow.java index 5a195e81..9502b1de 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindow.java +++ b/stepik-union/src/main/java/org/stepik/core/ui/StudyToolWindow.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.ui; +package org.stepik.core.ui; import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.util.PropertiesComponent; @@ -17,16 +17,16 @@ import com.intellij.ui.OnePixelSplitter; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.components.BorderLayoutPanel; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyBasePluginConfigurator; -import com.jetbrains.tmp.learning.StudyPluginConfigurator; -import com.jetbrains.tmp.learning.StudyUtils; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StepType; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.courseFormat.stepHelpers.VideoStepNodeHelper; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyBasePluginConfigurator; +import org.stepik.core.StudyPluginConfigurator; +import org.stepik.core.StudyUtils; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepType; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.courseFormat.stepHelpers.VideoStepNodeHelper; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; @@ -42,22 +42,22 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import static com.jetbrains.tmp.learning.StudyUtils.getChoiceStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getCodeStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getDatasetStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getFillBlanksStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getMatchingStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getMathStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getNumberStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getSortingStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getStringStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getTableStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getTextStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getUnknownStepText; -import static com.jetbrains.tmp.learning.StudyUtils.getVideoStepText; -import static com.jetbrains.tmp.learning.courseFormat.StepType.CODE; -import static com.jetbrains.tmp.learning.courseFormat.StepType.TEXT; -import static com.jetbrains.tmp.learning.courseFormat.StepType.VIDEO; +import static org.stepik.core.StudyUtils.getChoiceStepText; +import static org.stepik.core.StudyUtils.getCodeStepText; +import static org.stepik.core.StudyUtils.getDatasetStepText; +import static org.stepik.core.StudyUtils.getFillBlanksStepText; +import static org.stepik.core.StudyUtils.getMatchingStepText; +import static org.stepik.core.StudyUtils.getMathStepText; +import static org.stepik.core.StudyUtils.getNumberStepText; +import static org.stepik.core.StudyUtils.getSortingStepText; +import static org.stepik.core.StudyUtils.getStringStepText; +import static org.stepik.core.StudyUtils.getTableStepText; +import static org.stepik.core.StudyUtils.getTextStepText; +import static org.stepik.core.StudyUtils.getUnknownStepText; +import static org.stepik.core.StudyUtils.getVideoStepText; +import static org.stepik.core.courseFormat.StepType.CODE; +import static org.stepik.core.courseFormat.StepType.TEXT; +import static org.stepik.core.courseFormat.StepType.VIDEO; import static org.stepik.core.utils.PluginUtils.PLUGIN_ID; public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvider, Disposable, ActionListener { diff --git a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java b/stepik-union/src/main/java/org/stepik/core/ui/StudyToolWindowFactory.java similarity index 93% rename from stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java rename to stepik-union/src/main/java/org/stepik/core/ui/StudyToolWindowFactory.java index eb8e6a0e..740acec5 100644 --- a/stepik-union/src/main/java/com/jetbrains/tmp/learning/ui/StudyToolWindowFactory.java +++ b/stepik-union/src/main/java/org/stepik/core/ui/StudyToolWindowFactory.java @@ -1,4 +1,4 @@ -package com.jetbrains.tmp.learning.ui; +package org.stepik.core.ui; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.DumbAware; @@ -8,7 +8,7 @@ import com.intellij.openapi.wm.ToolWindowFactory; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManager; -import com.jetbrains.tmp.learning.StepikProjectManager; +import org.stepik.core.StepikProjectManager; import icons.AllStepikIcons; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/org/stepik/core/utils/ModuleUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/ModuleUtils.java index 71e28ebc..440ece34 100644 --- a/stepik-union/src/main/java/org/stepik/core/utils/ModuleUtils.java +++ b/stepik-union/src/main/java/org/stepik/core/utils/ModuleUtils.java @@ -5,8 +5,8 @@ import com.intellij.openapi.module.ModuleWithNameAlreadyExists; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; import org.stepik.plugin.projectWizard.idea.StepModuleBuilder; diff --git a/stepik-union/src/main/java/org/stepik/core/utils/PresentationUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/PresentationUtils.java index 4599c7a3..13dcb356 100644 --- a/stepik-union/src/main/java/org/stepik/core/utils/PresentationUtils.java +++ b/stepik-union/src/main/java/org/stepik/core/utils/PresentationUtils.java @@ -1,12 +1,12 @@ package org.stepik.core.utils; import com.intellij.ui.JBColor; -import com.jetbrains.tmp.learning.courseFormat.CourseNode; -import com.jetbrains.tmp.learning.courseFormat.LessonNode; -import com.jetbrains.tmp.learning.courseFormat.SectionNode; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.courseFormat.StudyStatus; +import org.stepik.core.courseFormat.CourseNode; +import org.stepik.core.courseFormat.LessonNode; +import org.stepik.core.courseFormat.SectionNode; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StudyStatus; import icons.AllStepikIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java index 204ec0aa..ff170fbb 100644 --- a/stepik-union/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java +++ b/stepik-union/src/main/java/org/stepik/core/utils/ProgrammingLanguageUtils.java @@ -12,11 +12,11 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil; -import com.jetbrains.tmp.learning.StudyUtils; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.core.EduNames; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StudyUtils; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.core.EduNames; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; diff --git a/stepik-union/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java b/stepik-union/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java index 4ea6cba0..668ec9b0 100644 --- a/stepik-union/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java +++ b/stepik-union/src/main/java/org/stepik/core/utils/ProjectFilesUtils.java @@ -10,10 +10,10 @@ import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiManager; -import com.jetbrains.tmp.learning.StudyUtils; -import com.jetbrains.tmp.learning.core.EduNames; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StudyUtils; +import org.stepik.core.core.EduNames; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/plugin/StepikPluginConfigurator.java b/stepik-union/src/main/java/org/stepik/plugin/StepikPluginConfigurator.java index d3280bbe..5374c35f 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/StepikPluginConfigurator.java +++ b/stepik-union/src/main/java/org/stepik/plugin/StepikPluginConfigurator.java @@ -2,8 +2,8 @@ import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyBasePluginConfigurator; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyBasePluginConfigurator; import org.jetbrains.annotations.NotNull; import org.stepik.plugin.actions.navigation.StepikNextStepAction; import org.stepik.plugin.actions.navigation.StepikPreviousStepAction; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/SendAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/SendAction.java index 9ab52df0..603ca4c4 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/SendAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/SendAction.java @@ -6,10 +6,10 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyStatus; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyStatus; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; @@ -20,7 +20,7 @@ import org.stepik.core.metrics.MetricsStatus; import org.stepik.core.utils.Utils; -import static com.jetbrains.tmp.learning.courseFormat.StudyStatus.SOLVED; +import static org.stepik.core.courseFormat.StudyStatus.SOLVED; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.metrics.MetricsStatus.TIME_OVER; import static org.stepik.core.metrics.MetricsStatus.USER_CANCELED; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikNextStepAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikNextStepAction.java index 12225e48..b3eec277 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikNextStepAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikNextStepAction.java @@ -3,7 +3,7 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.KeyboardShortcut; import com.intellij.openapi.keymap.KeymapUtil; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikPreviousStepAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikPreviousStepAction.java index 298fc808..2def602e 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikPreviousStepAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikPreviousStepAction.java @@ -3,7 +3,7 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.KeyboardShortcut; import com.intellij.openapi.keymap.KeymapUtil; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikStepNavigationAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikStepNavigationAction.java index 59034274..692d0853 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikStepNavigationAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StepikStepNavigationAction.java @@ -1,8 +1,8 @@ package org.stepik.plugin.actions.navigation; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.plugin.utils.NavigationUtils; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StudyNavigator.java b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StudyNavigator.java index 6b0ed5b4..9f27d309 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StudyNavigator.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StudyNavigator.java @@ -1,6 +1,6 @@ package org.stepik.plugin.actions.navigation; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StudyStepNavigationAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StudyStepNavigationAction.java index 91dfa839..79248dc3 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StudyStepNavigationAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/navigation/StudyStepNavigationAction.java @@ -3,10 +3,10 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyUtils; -import com.jetbrains.tmp.learning.actions.StudyActionWithShortcut; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyUtils; +import org.stepik.core.actions.StudyActionWithShortcut; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/AbstractStepAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/AbstractStepAction.java index 4d845eae..d3315894 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/AbstractStepAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/AbstractStepAction.java @@ -1,10 +1,10 @@ package org.stepik.plugin.actions.step; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.actions.StudyActionWithShortcut; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.actions.StudyActionWithShortcut; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.Nullable; import javax.swing.*; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/DownloadSubmission.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/DownloadSubmission.java index 25ead86c..b4219cb4 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/DownloadSubmission.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/DownloadSubmission.java @@ -20,12 +20,12 @@ import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.courseFormat.StudyStatus; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StudyStatus; +import org.stepik.core.stepik.StepikConnectorLogin; import icons.AllStepikIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/InsertStepikDirectives.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/InsertStepikDirectives.java index 87d17dd4..c50f96bd 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/InsertStepikDirectives.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/InsertStepikDirectives.java @@ -11,10 +11,10 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.core.metrics.Metrics; @@ -23,7 +23,7 @@ import javax.swing.*; -import static com.jetbrains.tmp.learning.courseFormat.StepType.CODE; +import static org.stepik.core.courseFormat.StepType.CODE; import static org.stepik.core.metrics.MetricsStatus.SUCCESSFUL; import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; import static org.stepik.plugin.utils.DirectivesUtils.insertAmbientCode; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikJavaPostAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikJavaPostAction.java index c157f58e..fd7df046 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikJavaPostAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikJavaPostAction.java @@ -6,11 +6,11 @@ import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.client.StepikApiClient; diff --git a/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikResetStepAction.java b/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikResetStepAction.java index 311d317d..b1f4db5f 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikResetStepAction.java +++ b/stepik-union/src/main/java/org/stepik/plugin/actions/step/StepikResetStepAction.java @@ -12,9 +12,9 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.problems.WolfTheProblemSolver; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; import icons.AllStepikIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,7 +23,7 @@ import javax.swing.*; -import static com.jetbrains.tmp.learning.courseFormat.StepType.CODE; +import static org.stepik.core.courseFormat.StepType.CODE; import static org.stepik.core.utils.ProjectFilesUtils.getOrCreateSrcDirectory; public class StepikResetStepAction extends AbstractStepAction { diff --git a/stepik-union/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java b/stepik-union/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java index 6d2a3211..99430398 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java +++ b/stepik-union/src/main/java/org/stepik/plugin/auth/ui/AuthDialog.java @@ -1,7 +1,7 @@ package org.stepik.plugin.auth.ui; import com.intellij.icons.AllIcons; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.stepik.StepikConnectorLogin; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; diff --git a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java index 49a79deb..4673e878 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java +++ b/stepik-union/src/main/java/org/stepik/plugin/collective/ui/StepikSettingsPanel.java @@ -1,7 +1,7 @@ package org.stepik.plugin.collective.ui; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.stepik.StepikConnectorLogin; import org.stepik.core.utils.Utils; import javax.swing.*; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectView/NavBarModelExtensionUtils.java b/stepik-union/src/main/java/org/stepik/plugin/projectView/NavBarModelExtensionUtils.java index e7bc33de..df06515b 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectView/NavBarModelExtensionUtils.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectView/NavBarModelExtensionUtils.java @@ -5,8 +5,8 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.Nullable; import static org.stepik.plugin.utils.PresentationDataUtils.isVisibleDirectory; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikDirectoryNode.java b/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikDirectoryNode.java index 40ecb559..831a3911 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikDirectoryNode.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikDirectoryNode.java @@ -6,9 +6,9 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyUtils; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyUtils; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.stepik.plugin.utils.PresentationDataUtils; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikTreeStructureProvider.java b/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikTreeStructureProvider.java index 0bb2fc16..88e931b1 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikTreeStructureProvider.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectView/StepikTreeStructureProvider.java @@ -7,7 +7,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; -import com.jetbrains.tmp.learning.StepikProjectManager; +import org.stepik.core.StepikProjectManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java index 1ad7ddba..8d0e2ed6 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/StepikProjectGenerator.java @@ -4,11 +4,11 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNodeFactory; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StudyNodeFactory; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.stepik.api.client.StepikApiClient; import org.stepik.api.exceptions.StepikClientException; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java index 9ff4b38a..eea6ab16 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/CourseModuleBuilder.java @@ -15,10 +15,10 @@ import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.vfs.VirtualFileManager; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyProjectComponent; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyProjectComponent; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; import org.stepik.plugin.projectWizard.StepikProjectGenerator; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java index ff6e6cad..28f9ba1e 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/JavaWizardStep.java @@ -5,8 +5,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.stepik.api.objects.StudyObject; import org.stepik.core.projectWizard.ProjectWizardUtils; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java index c24af250..00ea7b19 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/SandboxModuleBuilder.java @@ -2,7 +2,7 @@ import com.intellij.ide.highlighter.ModuleFileType; import com.intellij.openapi.util.io.FileUtil; -import com.jetbrains.tmp.learning.core.EduNames; +import org.stepik.core.core.EduNames; import org.jetbrains.annotations.NotNull; public class SandboxModuleBuilder extends ModuleBuilderWithSrc { diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java index 712f6b92..637b8e9a 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/idea/StepModuleBuilder.java @@ -2,7 +2,7 @@ import com.intellij.ide.highlighter.ModuleFileType; import com.intellij.openapi.util.io.FileUtil; -import com.jetbrains.tmp.learning.courseFormat.StepNode; +import org.stepik.core.courseFormat.StepNode; import org.jetbrains.annotations.NotNull; public class StepModuleBuilder extends ModuleBuilderWithSrc { diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java index 20e0ddfd..da5acfa2 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/PyCharmWizardStep.java @@ -2,7 +2,7 @@ import com.intellij.facet.ui.ValidationResult; import com.intellij.openapi.project.Project; -import com.jetbrains.tmp.learning.SupportedLanguages; +import org.stepik.core.SupportedLanguages; import org.jetbrains.annotations.NotNull; import org.stepik.api.objects.StudyObject; import org.stepik.plugin.projectWizard.ui.ProjectSettingListener; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java index be427ed6..2ff7ff72 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/pycharm/StepikPyProjectGenerator.java @@ -20,10 +20,10 @@ import com.jetbrains.python.newProject.PyNewProjectSettings; import com.jetbrains.python.newProject.PythonProjectGenerator; import com.jetbrains.python.remote.PyProjectSynchronizer; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyProjectComponent; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyProjectComponent; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; import icons.AllStepikIcons; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java index dbee3b19..44875a66 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListBox.java @@ -1,6 +1,6 @@ package org.stepik.plugin.projectWizard.ui; -import com.jetbrains.tmp.learning.SupportedLanguages; +import org.stepik.core.SupportedLanguages; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.objects.StudyObject; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java index f2e139ed..5cb03c43 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/CourseListModel.java @@ -1,6 +1,6 @@ package org.stepik.plugin.projectWizard.ui; -import com.jetbrains.tmp.learning.SupportedLanguages; +import org.stepik.core.SupportedLanguages; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.api.objects.StudyObject; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java index 8df295aa..a986db5c 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/LanguageComboBox.java @@ -1,6 +1,6 @@ package org.stepik.plugin.projectWizard.ui; -import com.jetbrains.tmp.learning.SupportedLanguages; +import org.stepik.core.SupportedLanguages; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java index b0d8d72b..64b9d6c1 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSetting.java @@ -1,6 +1,6 @@ package org.stepik.plugin.projectWizard.ui; -import com.jetbrains.tmp.learning.SupportedLanguages; +import org.stepik.core.SupportedLanguages; import org.jetbrains.annotations.NotNull; import org.stepik.api.objects.StudyObject; diff --git a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java index b16bfef5..3dfde632 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java +++ b/stepik-union/src/main/java/org/stepik/plugin/projectWizard/ui/ProjectSettingsPanel.java @@ -1,8 +1,8 @@ package org.stepik.plugin.projectWizard.ui; import com.intellij.openapi.diagnostic.Logger; -import com.jetbrains.tmp.learning.SupportedLanguages; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.SupportedLanguages; +import org.stepik.core.stepik.StepikConnectorLogin; import org.jetbrains.annotations.NotNull; import org.stepik.api.objects.StudyObject; import org.stepik.plugin.projectWizard.StepikProjectGenerator; diff --git a/stepik-union/src/main/java/org/stepik/plugin/utils/DirectivesUtils.java b/stepik-union/src/main/java/org/stepik/plugin/utils/DirectivesUtils.java index 1cf1f21d..68fe9344 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/utils/DirectivesUtils.java +++ b/stepik-union/src/main/java/org/stepik/plugin/utils/DirectivesUtils.java @@ -9,7 +9,7 @@ import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.tmp.learning.SupportedLanguages; +import org.stepik.core.SupportedLanguages; import org.jetbrains.annotations.NotNull; import java.util.Arrays; diff --git a/stepik-union/src/main/java/org/stepik/plugin/utils/NavigationUtils.java b/stepik-union/src/main/java/org/stepik/plugin/utils/NavigationUtils.java index a6d8a8a0..b7e894c9 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/utils/NavigationUtils.java +++ b/stepik-union/src/main/java/org/stepik/plugin/utils/NavigationUtils.java @@ -12,9 +12,9 @@ import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.PsiManager; import com.intellij.util.ui.tree.TreeUtil; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.courseFormat.StepNode; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.courseFormat.StepNode; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.core.metrics.Metrics; diff --git a/stepik-union/src/main/java/org/stepik/plugin/utils/PresentationDataUtils.java b/stepik-union/src/main/java/org/stepik/plugin/utils/PresentationDataUtils.java index 1a8daf51..e5475ecc 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/utils/PresentationDataUtils.java +++ b/stepik-union/src/main/java/org/stepik/plugin/utils/PresentationDataUtils.java @@ -6,11 +6,11 @@ import com.intellij.psi.PsiFile; import com.intellij.ui.JBColor; import com.intellij.ui.SimpleTextAttributes; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.StudyUtils; -import com.jetbrains.tmp.learning.core.EduNames; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; -import com.jetbrains.tmp.learning.courseFormat.StudyStatus; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.StudyUtils; +import org.stepik.core.core.EduNames; +import org.stepik.core.courseFormat.StudyNode; +import org.stepik.core.courseFormat.StudyStatus; import icons.AllStepikIcons; import org.jetbrains.annotations.NotNull; import org.stepik.core.utils.PresentationUtils; diff --git a/stepik-union/src/main/java/org/stepik/plugin/utils/ProjectPsiFilesUtils.java b/stepik-union/src/main/java/org/stepik/plugin/utils/ProjectPsiFilesUtils.java index 2fa45f1c..33feed25 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/utils/ProjectPsiFilesUtils.java +++ b/stepik-union/src/main/java/org/stepik/plugin/utils/ProjectPsiFilesUtils.java @@ -3,8 +3,8 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFileSystemItem; -import com.jetbrains.tmp.learning.StepikProjectManager; -import com.jetbrains.tmp.learning.courseFormat.StudyNode; +import org.stepik.core.StepikProjectManager; +import org.stepik.core.courseFormat.StudyNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.stepik.core.utils.ProjectFilesUtils; diff --git a/stepik-union/src/main/java/org/stepik/plugin/utils/Utils.java b/stepik-union/src/main/java/org/stepik/plugin/utils/Utils.java index 5b8c6dd2..e4536e19 100644 --- a/stepik-union/src/main/java/org/stepik/plugin/utils/Utils.java +++ b/stepik-union/src/main/java/org/stepik/plugin/utils/Utils.java @@ -1,6 +1,6 @@ package org.stepik.plugin.utils; -import com.jetbrains.tmp.learning.stepik.StepikConnectorLogin; +import org.stepik.core.stepik.StepikConnectorLogin; import org.intellij.lang.annotations.Language; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/stepik-union/src/main/resources/META-INF/plugin.xml b/stepik-union/src/main/resources/META-INF/plugin.xml index 956cf01b..8e630f93 100644 --- a/stepik-union/src/main/resources/META-INF/plugin.xml +++ b/stepik-union/src/main/resources/META-INF/plugin.xml @@ -48,17 +48,17 @@ - com.jetbrains.tmp.learning.StudyProjectComponent + org.stepik.core.StudyProjectComponent - + - - - + + + \ No newline at end of file diff --git a/stepik-union/src/main/resources/templates/quiz/base.ftl b/stepik-union/src/main/resources/templates/quiz/base.ftl index d459563f..551647f6 100644 --- a/stepik-union/src/main/resources/templates/quiz/base.ftl +++ b/stepik-union/src/main/resources/templates/quiz/base.ftl @@ -1,4 +1,4 @@ -<#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.StepHelper" --> +<#-- @ftlvariable name="stepNode" type="org.stepik.core.courseFormat.stepHelpers.StepHelper" --> <#-- @ftlvariable name="text" type="java.lang.String" --> <#macro quiz_content> ${text}
    diff --git a/stepik-union/src/main/resources/templates/quiz/base_sorting.ftl b/stepik-union/src/main/resources/templates/quiz/base_sorting.ftl index a63e0205..b713cf62 100644 --- a/stepik-union/src/main/resources/templates/quiz/base_sorting.ftl +++ b/stepik-union/src/main/resources/templates/quiz/base_sorting.ftl @@ -1,7 +1,7 @@ <#-- @ftlvariable name="status" type="java.lang.String" --> <#-- @ftlvariable name="backgroundColor" type="java.lang.String" --> <#-- @ftlvariable name="darcula" type="java.lang.Boolean" --> -<#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.MatchingStepNodeHelper" --> +<#-- @ftlvariable name="stepNode" type="org.stepik.core.courseFormat.stepHelpers.MatchingStepNodeHelper" --> <#macro sorting_quiz> <#if darcula> diff --git a/stepik-union/src/main/resources/templates/quiz/choice.ftl b/stepik-union/src/main/resources/templates/quiz/choice.ftl index 831d23be..f5ae5aae 100644 --- a/stepik-union/src/main/resources/templates/quiz/choice.ftl +++ b/stepik-union/src/main/resources/templates/quiz/choice.ftl @@ -1,5 +1,5 @@ <#-- @ftlvariable name="disabled" type="java.lang.String" --> -<#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.ChoiceStepNodeHelper" --> +<#-- @ftlvariable name="stepNode" type="org.stepik.core.courseFormat.stepHelpers.ChoiceStepNodeHelper" --> <#include "base.ftl"> diff --git a/stepik-union/src/main/resources/templates/quiz/dataset.ftl b/stepik-union/src/main/resources/templates/quiz/dataset.ftl index 3ccb7962..98998b8a 100644 --- a/stepik-union/src/main/resources/templates/quiz/dataset.ftl +++ b/stepik-union/src/main/resources/templates/quiz/dataset.ftl @@ -1,6 +1,6 @@ <#-- @ftlvariable name="status" type="java.lang.String" --> <#-- @ftlvariable name="disabled" type="java.lang.String" --> -<#-- @ftlvariable name="stepNode" type="com.jetbrains.tmp.learning.courseFormat.stepHelpers.DatasetStepNodeHelper" --> +<#-- @ftlvariable name="stepNode" type="org.stepik.core.courseFormat.stepHelpers.DatasetStepNodeHelper" --> <#-- @ftlvariable name="text" type="java.lang.String" -->