diff --git a/python/ipnb/ipnb.iml b/python/ipnb/ipnb.iml
index 7d890c08321b..b351c473c80d 100644
--- a/python/ipnb/ipnb.iml
+++ b/python/ipnb/ipnb.iml
@@ -26,5 +26,6 @@
+
\ No newline at end of file
diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.form b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.form
index 62bcbb739ba5..278c6d533e66 100644
--- a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.form
+++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.form
@@ -1,6 +1,6 @@
diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.java
index 8f3d00fc9c95..378bc399a6a1 100644
--- a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.java
+++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.java
@@ -1,44 +1,56 @@
package org.jetbrains.plugins.ipnb.configuration;
+import com.intellij.icons.AllIcons;
+import com.intellij.ide.DataManager;
+import com.intellij.ide.IdeTooltipManager;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
+import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
+import com.intellij.openapi.ui.VerticalFlowLayout;
+import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.ui.JBColor;
+import com.intellij.ui.ClickListener;
+import com.intellij.ui.TooltipWithClickableLinks;
+import com.intellij.ui.UI;
import com.intellij.ui.components.JBLabel;
+import com.intellij.ui.components.JBPasswordField;
+import com.intellij.ui.components.JBRadioButton;
import com.intellij.ui.components.JBTextField;
+import com.intellij.util.PlatformUtils;
+import com.intellij.util.ui.UIUtil;
+import com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable;
+import net.miginfocom.swing.MigLayout;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
-import java.awt.event.FocusAdapter;
-import java.awt.event.FocusEvent;
+import java.awt.event.*;
public class IpnbConfigurable implements SearchableConfigurable {
+ private static final int DEFAULT_PADDING = 3;
private JPanel myMainPanel;
- private JBTextField myFieldUrl;
- private TextFieldWithBrowseButton myWorkingDirField;
- private JBTextField myArgumentsField;
- private JPasswordField myPasswordField;
- private JBTextField myUsernameField;
- private JBLabel myWarningLabel;
- @NotNull private final Project myProject;
+ private JBTextField myUrlField;
+ private TextFieldWithBrowseButton myNotebookDirectoryField;
+ private JBLabel myWarningIcon;
+ private JPanel mySpecificNotebookSettingsPanel;
+ private final Project myProject;
public IpnbConfigurable(@NotNull Project project) {
myProject = project;
- myWarningLabel.setForeground(new JBColor(new Color(164, 145, 52), new Color(187, 181, 41)));
+
final FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
- myWorkingDirField.addBrowseFolderListener("Select Working Directory", null, myProject, fileChooserDescriptor);
- myFieldUrl.setText(IpnbSettings.getInstance(myProject).getURL());
- myFieldUrl.addFocusListener(createUrlProtocolValidationListener());
- myUsernameField.addFocusListener(createUrlProtocolValidationListener());
- myPasswordField.addFocusListener(createUrlProtocolValidationListener());
- myWorkingDirField.setText(IpnbSettings.getInstance(myProject).getWorkingDirectory());
- myArgumentsField.setText(IpnbSettings.getInstance(myProject).getArguments());
+ myNotebookDirectoryField.addBrowseFolderListener("Select Working Directory", null, myProject, fileChooserDescriptor);
+
+ myUrlField.setText(IpnbSettings.getInstance(myProject).getURL());
+ myUrlField.addFocusListener(createUrlProtocolValidationListener());
+
+ final String workingDirectory = IpnbSettings.getInstance(myProject).getWorkingDirectory();
+ myNotebookDirectoryField.setText(workingDirectory.isEmpty() ? myProject.getBasePath() : workingDirectory);
}
@NotNull
@@ -46,24 +58,27 @@ public class IpnbConfigurable implements SearchableConfigurable {
return new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
- setWarningLabelText();
+ setWarningLabelIcon(IpnbSettings.getInstance(myProject).isRemote());
}
};
}
- private void setWarningLabelText() {
- final boolean isRemote = myPasswordField.getPassword().length > 0;
- final String url = myFieldUrl.getText();
- if (isRemote && !url.startsWith("https")) {
- myWarningLabel.setText("Only HTTPS urls are supported in remote notebooks");
- return;
- }
- if (!isRemote && url.startsWith("https")) {
- myWarningLabel.setText("Only HTTP urls are supported in local notebooks");
+ private void setWarningLabelIcon(boolean isRemote) {
+ if (myUrlField == null) return;
+ final String url = myUrlField.getText();
+ if (isRemote && !url.startsWith("https") || !isRemote && url.startsWith("https") ) {
+ Dimension oldPreferredSize = myWarningIcon.getPreferredSize();
+ myWarningIcon.setIcon(AllIcons.General.BalloonWarning);
+ myWarningIcon.setPreferredSize(oldPreferredSize);
+ myWarningIcon.setMinimumSize(oldPreferredSize);
+ myWarningIcon.revalidate();
+ String message = isRemote ? "Use HTTPS for remote notebooks" : "Use HTTP for local notebooks";
+ IdeTooltipManager.getInstance().setCustomTooltip(myWarningIcon, new TooltipWithClickableLinks.ForBrowser(myWarningIcon, message));
+
return;
}
- myWarningLabel.setText("");
+ myWarningIcon.setIcon(AllIcons.Nodes.EmptyNode);
}
@Nls
@@ -86,55 +101,39 @@ public class IpnbConfigurable implements SearchableConfigurable {
public boolean isModified() {
final String oldUrl = IpnbSettings.getInstance(myProject).getURL();
final String oldWorkingDirectory = IpnbSettings.getInstance(myProject).getWorkingDirectory();
- final String oldArguments = StringUtil.notNullize(IpnbSettings.getInstance(myProject).getArguments());
- final String url = StringUtil.trimEnd(StringUtil.notNullize(myFieldUrl.getText()), "/");
- final String workingDirectory = StringUtil.notNullize(myWorkingDirField.getText());
- final String arguments = StringUtil.notNullize(myArgumentsField.getText());
+ final String url = StringUtil.trimEnd(StringUtil.notNullize(myUrlField.getText()), "/");
+ final String workingDirectory = StringUtil.notNullize(myNotebookDirectoryField.getText());
- return !url.equals(oldUrl) || !workingDirectory.equals(oldWorkingDirectory) || !arguments.equals(oldArguments)
- || isCredentialsModified();
- }
-
- public boolean isCredentialsModified() {
- final String oldUsername = StringUtil.notNullize(IpnbSettings.getInstance(myProject).getUsername());
- final String oldPassword = IpnbSettings.getInstance(myProject).getPassword(myProject.getLocationHash());
-
- final String username = StringUtil.notNullize(myUsernameField.getText());
- final String password = StringUtil.notNullize(String.valueOf(myPasswordField.getPassword()));
-
- return !oldUsername.equals(username) || !oldPassword.equals(password);
+ final boolean isBaseModified = !url.equals(oldUrl) || !workingDirectory.equals(oldWorkingDirectory);
+
+ return isBaseModified || ((SettingsPanel)mySpecificNotebookSettingsPanel).isModified();
}
@Override
public void apply() throws ConfigurationException {
- IpnbSettings.getInstance(myProject).setWorkingDirectory(myWorkingDirField.getText());
- IpnbSettings.getInstance(myProject).setArguments(myArgumentsField.getText());
+ final IpnbSettings ipnbSettings = IpnbSettings.getInstance(myProject);
+ final String newNotebookDir = myNotebookDirectoryField.getText();
+ ipnbSettings.setWorkingDirectory(newNotebookDir.isEmpty() ? myProject.getBasePath() : newNotebookDir);
- String url = StringUtil.notNullize(myFieldUrl.getText());
- url = StringUtil.trimEnd(url, "/");
- final boolean urlModified = !url.equals(IpnbSettings.getInstance(myProject).getURL());
- if (urlModified) {
+ String url = StringUtil.trimEnd(StringUtil.notNullize(myUrlField.getText()), "/");
+ if (!url.equals(ipnbSettings.getURL())) {
IpnbConnectionManager.getInstance(myProject).shutdownKernels();
- IpnbSettings.getInstance(myProject).setURL(url);
- }
-
- if (isCredentialsModified()) {
- IpnbConnectionManager.getInstance(myProject).shutdownKernels();
- IpnbSettings.getInstance(myProject).setUsername(myUsernameField.getText());
- IpnbSettings.getInstance(myProject).setPassword(String.valueOf(myPasswordField.getPassword()), myProject.getLocationHash());
+ ipnbSettings.setURL(url);
}
+
+ ((SettingsPanel)mySpecificNotebookSettingsPanel).apply();
}
@Override
public void reset() {
- myFieldUrl.setText(IpnbSettings.getInstance(myProject).getURL());
- myWorkingDirField.setText(IpnbSettings.getInstance(myProject).getWorkingDirectory());
- myArgumentsField.setText(IpnbSettings.getInstance(myProject).getArguments());
- myUsernameField.setText(IpnbSettings.getInstance(myProject).getUsername());
- myPasswordField.setText(IpnbSettings.getInstance(myProject).getPassword(myProject.getLocationHash()));
+ myUrlField.setText(IpnbSettings.getInstance(myProject).getURL());
+ final String workingDirectory = IpnbSettings.getInstance(myProject).getWorkingDirectory();
+ myNotebookDirectoryField.setText(workingDirectory.isEmpty() ? myProject.getBasePath() : workingDirectory);
+
+ ((SettingsPanel)mySpecificNotebookSettingsPanel).reset();
- setWarningLabelText();
+ setWarningLabelIcon(IpnbSettings.getInstance(myProject).isRemote());
}
@NotNull
@@ -142,5 +141,362 @@ public class IpnbConfigurable implements SearchableConfigurable {
public String getId() {
return "IpnbConfigurable";
}
+
+ private void createUIComponents() {
+ // TODO: remove this hack
+ int gap = SystemInfo.isWindows ? 1 : 2;
+ mySpecificNotebookSettingsPanel = PlatformUtils.isPyCharmPro() ? new SettingsPanelPro() : new LocalSettingsPanel(true, 0, gap);
+ }
+
+ private abstract static class SettingsPanel extends JPanel {
+ public abstract boolean isModified();
+
+ public abstract void apply();
+
+ public abstract void reset();
+ }
+
+ private class SettingsPanelPro extends SettingsPanel {
+ private final JBRadioButton myLocal;
+ private final JBRadioButton myRemote;
+ private final RemoteSettingsPanel myRemoteSettingsPanel;
+ private final LocalSettingsPanel myLocalSettingsPanel;
+
+ public SettingsPanelPro() {
+ final boolean isRemote = IpnbSettings.getInstance(myProject).isRemote();
+
+ myLocal = createModeRadioButton("Local");
+ myLocal.addItemListener(createRadioButtonListener(myLocal));
+
+ myRemote = createModeRadioButton("Remote");
+
+ myRemoteSettingsPanel = new RemoteSettingsPanel(isRemote);
+ myLocalSettingsPanel = new LocalSettingsPanel(!isRemote, DEFAULT_PADDING, 1);
+
+ final ButtonGroup group = new ButtonGroup();
+ myLocal.setSelected(!isRemote);
+ myRemote.setSelected(isRemote);
+ group.add(myLocal);
+ group.add(myRemote);
+
+ final JPanel localPanel = new JPanel(new BorderLayout(10, 1));
+ localPanel.add(myLocal, BorderLayout.NORTH);
+ localPanel.add(myLocalSettingsPanel, BorderLayout.CENTER);
+
+ final JPanel remotePanel = new JPanel(new BorderLayout(10, 1));
+ remotePanel.add(myRemote, BorderLayout.NORTH);
+ remotePanel.add(myRemoteSettingsPanel, BorderLayout.CENTER);
+
+ setLayout(new VerticalFlowLayout(VerticalFlowLayout.MIDDLE, 0, 1, true, false));
+ add(localPanel);
+ add(remotePanel);
+
+ setWarningLabelIcon(isRemote);
+ }
+
+ public boolean isModified() {
+ final boolean wasRemote = IpnbSettings.getInstance(myProject).isRemote();
+ final boolean isRemote = myRemote.isSelected();
+
+ if (wasRemote != isRemote) return true;
+
+ if (wasRemote) {
+ return myRemoteSettingsPanel.isModified();
+ }
+ else {
+ return myLocalSettingsPanel.isModified();
+ }
+ }
+
+ @Override
+ public void apply() {
+ final boolean isRemote = myRemote.isSelected();
+ final boolean wasRemote = IpnbSettings.getInstance(myProject).isRemote();
+
+ if (isRemote != wasRemote) {
+ IpnbConnectionManager.getInstance(myProject).shutdownKernels();
+ IpnbSettings.getInstance(myProject).setRemote(isRemote);
+ }
+
+ if (isRemote) {
+ myRemoteSettingsPanel.apply();
+ }
+ else {
+ myLocalSettingsPanel.apply();
+ }
+ }
+
+ @Override
+ public void reset() {
+ final boolean isRemote = IpnbSettings.getInstance(myProject).isRemote();
+ myRemote.setSelected(isRemote);
+ myLocal.setSelected(!isRemote);
+
+ if (isRemote) {
+ myRemoteSettingsPanel.reset();
+ }
+ else {
+ myLocalSettingsPanel.reset();
+ }
+ }
+
+ @NotNull
+ private ItemListener createRadioButtonListener(@NotNull JBRadioButton local) {
+ return new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
+ if (local.isSelected()) {
+ myLocalSettingsPanel.enablePanel();
+ myRemoteSettingsPanel.disablePanel();
+ setWarningLabelIcon(false);
+ }
+ else {
+ myLocalSettingsPanel.disablePanel();
+ myRemoteSettingsPanel.enablePanel();
+ setWarningLabelIcon(true);
+ }
+ }
+ };
+ }
+ }
+
+ @NotNull
+ private static JBRadioButton createModeRadioButton(@NotNull String text) {
+ final JBRadioButton local = new JBRadioButton(text);
+ local.setFocusable(false);
+ local.setBorder(null);
+ return local;
+ }
+
+ private class LocalSettingsPanel extends SettingsPanel {
+ private static final String PARAMETERS_TEXT = "Additional options:";
+ private static final String DEFAULT_PARAMETERS_TEXT = "for example: --profile=nbserver";
+ private JBTextField myAdditionalOptions;
+ private final JLabel myParametersLabel;
+
+ public LocalSettingsPanel(boolean enabled, int leftPadding, int gap) {
+ myParametersLabel = new JLabel(PARAMETERS_TEXT);
+ myAdditionalOptions = new JBTextField();
+ myAdditionalOptions.addFocusListener(createInitialTextFocusAdapter(myAdditionalOptions, DEFAULT_PARAMETERS_TEXT));
+ initFields();
+
+ setLayout(new MigLayout("insets 0", leftPadding + "unrel[]" + gap + "unrel[grow]", "[][]"));
+ add(myParametersLabel);
+ add(myAdditionalOptions, "growx");
+ if (enabled) {
+ enablePanel();
+ }
+ else {
+ disablePanel();
+ }
+ }
+
+ public void enablePanel() {
+ myParametersLabel.setEnabled(true);
+ myParametersLabel.setForeground(UIUtil.getActiveTextColor());
+ myAdditionalOptions.setEnabled(true);
+ }
+
+ public void disablePanel() {
+ myParametersLabel.setEnabled(false);
+ myParametersLabel.setForeground(UIUtil.getInactiveTextColor());
+ myAdditionalOptions.setEnabled(false);
+ }
+
+ @Override
+ public void apply() {
+ final String parameters = myAdditionalOptions.getText();
+ if (!parameters.equals(DEFAULT_PARAMETERS_TEXT)) {
+ IpnbSettings.getInstance(myProject).setArguments(parameters);
+ }
+ else {
+ IpnbSettings.getInstance(myProject).setArguments("");
+ }
+ }
+
+ @Override
+ public void reset() {
+ initFields();
+ }
+
+ private void initFields() {
+ final String arguments = IpnbSettings.getInstance(myProject).getArguments();
+ setInitialText(myAdditionalOptions, arguments, DEFAULT_PARAMETERS_TEXT);
+ }
+
+ public boolean isModified() {
+ final IpnbSettings ipnbSettings = IpnbSettings.getInstance(myProject);
+ final String arguments = ipnbSettings.getArguments();
+ final String text = StringUtil.trim(StringUtil.notNullize(myAdditionalOptions.getText()));
+
+ return !text.equals(arguments);
+ }
+ }
+
+ private class RemoteSettingsPanel extends SettingsPanel {
+ private static final String DEFAULT_USERNAME_TEXT = "Leave empty for a single-user notebook";
+
+ private JBTextField myUsernameField;
+ private JBPasswordField myPasswordField;
+ private JLabel myInterpreterSetupLinkLabel;
+ private JBLabel myPasswordLabel;
+ private JBLabel myUsernameLabel;
+ private boolean myIsEnabled;
+
+
+ public RemoteSettingsPanel(boolean enabled) {
+ myIsEnabled = enabled;
+ myInterpreterSetupLinkLabel = new JLabel("Configure remote interpreter");
+ myInterpreterSetupLinkLabel.setForeground(UI.getColor("link.foreground"));
+ myInterpreterSetupLinkLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
+ createNavigateToInterpreterSettingsListener().installOn(myInterpreterSetupLinkLabel);
+
+
+ setLayout(new MigLayout("insets 0", DEFAULT_PADDING + "unrel[]5unrel[grow]", "[][][]"));
+ myUsernameLabel = new JBLabel("Username:");
+ myUsernameField = new JBTextField();
+ myUsernameField.addFocusListener(createInitialTextFocusAdapter(myUsernameField, DEFAULT_USERNAME_TEXT));
+ setInitialText(myUsernameField, IpnbSettings.getInstance(myProject).getUsername(), DEFAULT_USERNAME_TEXT);
+ myPasswordLabel = new JBLabel("Password:");
+ myPasswordField = new JBPasswordField();
+
+
+ add(myUsernameLabel);
+ add(myUsernameField, "cell 1 0, growx, wrap");
+ add(myPasswordLabel);
+ add(myPasswordField, "cell 1 1, growx, wrap");
+ add(myInterpreterSetupLinkLabel, "cell 1 2, align right");
+
+ if (myIsEnabled) {
+ enablePanel();
+ }
+ else {
+ disablePanel();
+ }
+ }
+
+ @NotNull
+ private ClickListener createNavigateToInterpreterSettingsListener() {
+ return new ClickListener() {
+ @Override
+ public boolean onClick(@NotNull MouseEvent event, int clickCount) {
+ if (myIsEnabled) {
+ final Settings settings = Settings.KEY.getData(DataManager.getInstance().getDataContext(RemoteSettingsPanel.this));
+ if (settings != null) {
+ settings.select(settings.find(PyActiveSdkModuleConfigurable.class.getName()));
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ }
+
+ public void enablePanel() {
+ myIsEnabled = true;
+ myUsernameField.setEnabled(true);
+ myUsernameLabel.setEnabled(true);
+ myUsernameLabel.setForeground(UIUtil.getActiveTextColor());
+ if (DEFAULT_USERNAME_TEXT.equals(myUsernameField.getText())) {
+ myUsernameField.setForeground(UIUtil.getInactiveTextColor());
+ }
+
+ myPasswordField.setEnabled(true);
+ myPasswordLabel.setEnabled(true);
+ myPasswordLabel.setForeground(UIUtil.getActiveTextColor());
+
+ myInterpreterSetupLinkLabel.setEnabled(true);
+ myInterpreterSetupLinkLabel.setForeground(UI.getColor("link.foreground"));
+ myInterpreterSetupLinkLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
+ }
+
+ public void disablePanel() {
+ myIsEnabled = false;
+ myUsernameField.setEnabled(false);
+ myUsernameLabel.setEnabled(false);
+ myUsernameLabel.setForeground(UIUtil.getInactiveTextColor());
+
+ myPasswordField.setEnabled(false);
+ myPasswordLabel.setEnabled(false);
+ myPasswordLabel.setForeground(UIUtil.getInactiveTextColor());
+
+ myInterpreterSetupLinkLabel.setEnabled(false);
+ myInterpreterSetupLinkLabel.setForeground(UIUtil.getInactiveTextColor());
+ myInterpreterSetupLinkLabel.setCursor(Cursor.getDefaultCursor());
+ }
+
+ @Override
+ public void apply() {
+ final IpnbSettings ipnbSettings = IpnbSettings.getInstance(myProject);
+
+ final String oldUsername = ipnbSettings.getUsername();
+ final String oldPassword = ipnbSettings.getPassword(myProject.getLocationHash());
+
+ final String newUsername = myUsernameField.getText().equals(DEFAULT_USERNAME_TEXT) ? "" : myUsernameField.getText();
+ final String newPassword = String.valueOf(myPasswordField.getPassword());
+
+ if (!oldUsername.equals(newUsername) || !oldPassword.equals(newPassword)) {
+ IpnbConnectionManager.getInstance(myProject).shutdownKernels();
+ ipnbSettings.setUsername(newUsername);
+ ipnbSettings.setPassword(newPassword, myProject.getLocationHash());
+ }
+ }
+
+ @Override
+ public void reset() {
+ final IpnbSettings ipnbSettings = IpnbSettings.getInstance(myProject);
+
+ final String savedUsername = ipnbSettings.getUsername();
+ setInitialText(myUsernameField, savedUsername, DEFAULT_USERNAME_TEXT);
+
+ final String savedPassword = ipnbSettings.getPassword(myProject.getLocationHash());
+ myPasswordField.setText(savedPassword);
+ }
+
+ public boolean isModified() {
+ final IpnbSettings ipnbSettings = IpnbSettings.getInstance(myProject);
+ final String oldUsername = ipnbSettings.getUsername();
+ final String oldPassword = ipnbSettings.getPassword(myProject.getLocationHash());
+
+ final String newPassword = String.valueOf(myPasswordField.getPassword());
+ final String newUsername = myUsernameField.getText();
+
+ return !oldPassword.equals(newPassword) || !oldUsername.equals(newUsername);
+ }
+ }
+
+ @NotNull
+ private static FocusAdapter createInitialTextFocusAdapter(@NotNull JBTextField field, @NotNull String initialText) {
+ return new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ if (field.getText().equals(initialText)) {
+ field.setForeground(UIUtil.getActiveTextColor());
+ field.setText("");
+ }
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ if (field.getText().isEmpty()) {
+ field.setForeground(UIUtil.getInactiveTextColor());
+ field.setText(initialText);
+ }
+ }
+ };
+ }
+
+ private static void setInitialText(@NotNull JBTextField field,
+ @NotNull String savedValue,
+ @NotNull String defaultText) {
+ if (savedValue.isEmpty()) {
+ field.setForeground(UIUtil.getInactiveTextColor());
+ field.setText(defaultText);
+ }
+ else {
+ field.setForeground(UIUtil.getActiveTextColor());
+ field.setText(savedValue);
+ }
+ }
}
diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConnectionManager.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConnectionManager.java
index 13dc41c1c841..f2c7e526a8f1 100644
--- a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConnectionManager.java
+++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConnectionManager.java
@@ -105,7 +105,7 @@ public final class IpnbConnectionManager implements ProjectComponent {
@NotNull final String path) {
final String url = getURL();
if (connectToIpythonServer(codePanel, fileEditor, path, url)) return;
- final boolean isRemote = IpnbSettings.getInstance(myProject).isRemote(myProject.getLocationHash());
+ final boolean isRemote = IpnbSettings.getInstance(myProject).isRemote();
if (!isRemote) {
ApplicationManager.getApplication().executeOnPooledThread(() -> {
final boolean serverStarted = startIpythonServer(url, fileEditor);
@@ -122,7 +122,7 @@ public final class IpnbConnectionManager implements ProjectComponent {
@NotNull final String path,
@NotNull final String url) {
final IpnbSettings ipnbSettings = IpnbSettings.getInstance(myProject);
- final boolean isRemote = ipnbSettings.isRemote(myProject.getLocationHash());
+ final boolean isRemote = ipnbSettings.isRemote();
if (!isRemote) {
if (myToken != null) return startConnection(codePanel, path, url, true);
final Module module = ProjectFileIndex.SERVICE.getInstance(myProject).getModuleForFile(fileEditor.getVirtualFile());
diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbSettings.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbSettings.java
index 0e97741d0c9d..8edfdaea47d6 100644
--- a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbSettings.java
+++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbSettings.java
@@ -19,6 +19,15 @@ public class IpnbSettings implements PersistentStateComponent {
private String myWorkingDirectory;
private String myArguments = "";
private String myUsername;
+ private boolean myIsRemote;
+
+ public boolean isRemote() {
+ return myIsRemote;
+ }
+
+ public void setRemote(boolean remote) {
+ myIsRemote = remote;
+ }
public static IpnbSettings getInstance(@NotNull Project project) {
return ServiceManager.getService(project, IpnbSettings.class);
@@ -77,11 +86,6 @@ public class IpnbSettings implements PersistentStateComponent {
final String accountName = createAccountName(username, url, projectPathHash);
PasswordSafe.getInstance().setPassword(IpnbSettings.class, accountName, password);
}
-
- public boolean isRemote(String locationHash) {
- final String password = getPassword(locationHash);
- return !password.isEmpty();
- }
private static String createAccountName(@NotNull String username, @NotNull String url, @NotNull String projectPath) {
return IPNB_PASSWORD_KEY + url + username + projectPath;
diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/protocol/IpnbConnection.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/protocol/IpnbConnection.java
index 1977e37eab5a..3edb20cf99a3 100644
--- a/python/ipnb/src/org/jetbrains/plugins/ipnb/protocol/IpnbConnection.java
+++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/protocol/IpnbConnection.java
@@ -94,7 +94,7 @@ public class IpnbConnection {
myProject = project;
myCookieManager = new CookieManager();
CookieHandler.setDefault(myCookieManager);
- if (!IpnbSettings.getInstance(project).isRemote(project.getLocationHash())) {
+ if (!IpnbSettings.getInstance(project).isRemote()) {
if (!"http".equals(myURI.getScheme())) {
throw new UnsupportedOperationException("Only http urls are supported for local notebooks");
}
@@ -103,7 +103,7 @@ public class IpnbConnection {
throw new UnsupportedOperationException("Only https urls are supported for remote notebooks");
}
- if (IpnbSettings.getInstance(project).isRemote(project.getLocationHash())) {
+ if (IpnbSettings.getInstance(project).isRemote()) {
String loginUrl = getLoginUrl();
initXSRF(myURI.toString() + loginUrl);
myIsHubServer = isHubServer(loginUrl);