package manager refactoring step 2: move core classes to com.intellij.webcore.packaging; decouple ManageRepoDialog from Python service

This commit is contained in:
Dmitry Jemerov
2013-04-26 13:42:53 +02:00
parent b5def8cfd5
commit 6f904e4b1d
8 changed files with 40 additions and 193 deletions

View File

@@ -37,6 +37,7 @@
<orderEntry type="module" module-name="ChromeConnector" />
<orderEntry type="module" module-name="FirefoxConnector" />
<orderEntry type="module" module-name="python-openapi" exported="" />
<orderEntry type="module" module-name="webide-api" />
</component>
<component name="copyright">
<Base>

View File

@@ -8,6 +8,7 @@ import com.intellij.openapi.ui.Messages;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.net.HttpConfigurable;
import com.intellij.webcore.packaging.RepoPackage;
import org.apache.xmlrpc.*;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -24,7 +25,10 @@ import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

View File

@@ -1,29 +0,0 @@
package com.jetbrains.python.packaging;
/**
* User: catherine
*/
public class RepoPackage implements Comparable {
private final String myName;
private final String myRepoUrl;
public RepoPackage(String name, String repoUrl) {
myName = name;
myRepoUrl = repoUrl;
}
public String getName() {
return myName;
}
public String getRepoUrl() {
return myRepoUrl;
}
@Override
public int compareTo(Object o) {
if (o instanceof RepoPackage)
return myName.compareTo(((RepoPackage)o).getName());
return 0;
}
}

View File

@@ -20,10 +20,12 @@ import com.intellij.util.Function;
import com.intellij.util.ui.PlatformColors;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.update.UiNotifyConnector;
import com.intellij.webcore.packaging.ManageRepoDialog;
import com.intellij.webcore.packaging.PackageManagerController;
import com.intellij.webcore.packaging.RepoPackage;
import com.jetbrains.python.packaging.PyPIPackageUtil;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.packaging.PyPackageService;
import com.jetbrains.python.packaging.RepoPackage;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -53,6 +55,7 @@ import java.util.List;
public class ManagePackagesDialog extends DialogWrapper {
private static final Logger LOG = Logger.getInstance(ManagePackagesDialog.class);
@NotNull private final Project myProject;
private final PackageManagerController myController;
private JPanel myFilter;
@@ -80,6 +83,7 @@ public class ManagePackagesDialog extends DialogWrapper {
public ManagePackagesDialog(@NotNull Project project, @NotNull final Sdk sdk, @NotNull final PyPackagesPanel packageListPanel,
final PackageManagerController packageManagerController) {
super(project, true);
myProject = project;
myController = packageManagerController;
myInstallToUser.setEnabled(!PythonSdkType.isVirtualEnv(sdk));
@@ -102,7 +106,7 @@ public class ManagePackagesDialog extends DialogWrapper {
@Override
public void run() {
try {
myController.reloadPackagesList();
myController.reloadAllPackages();
myPackages.setPaintBusy(false);
}
catch (IOException e) {
@@ -188,7 +192,7 @@ public class ManagePackagesDialog extends DialogWrapper {
myManageButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
ManageRepoDialog dialog = new ManageRepoDialog();
ManageRepoDialog dialog = new ManageRepoDialog(myProject, myController);
dialog.show();
}
});

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.python.packaging.ui.ManageRepoDialog">
<grid id="cbd77" binding="myMainPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
<xy x="48" y="54" width="550" height="342"/>
</constraints>
<properties/>
<border type="none"/>
<children/>
</grid>
</form>

View File

@@ -1,119 +0,0 @@
package com.jetbrains.python.packaging.ui;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.InputValidator;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.AnActionButton;
import com.intellij.ui.AnActionButtonRunnable;
import com.intellij.ui.AnActionButtonUpdater;
import com.intellij.ui.ToolbarDecorator;
import com.intellij.ui.components.JBList;
import com.jetbrains.python.packaging.PyPIPackageUtil;
import com.jetbrains.python.packaging.PyPackageService;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
public class ManageRepoDialog extends DialogWrapper {
private JPanel myMainPanel;
private JBList myList;
private boolean myEnabled;
public ManageRepoDialog() {
super(false);
init();
setTitle("Manage Repositories");
final DefaultListModel repoModel = new DefaultListModel();
repoModel.addElement(PyPIPackageUtil.PYPI_URL);
for (String url : PyPackageService.getInstance().additionalRepositories) {
repoModel.addElement(url);
}
myList = new JBList();
myList.setModel(repoModel);
myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent event) {
final Object selected = myList.getSelectedValue();
myEnabled = !PyPIPackageUtil.PYPI_URL.equals(selected);
}
});
final ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myList).disableUpDownActions();
decorator.setAddActionName("Add repository");
decorator.setRemoveActionName("Remove repository from list");
decorator.setEditActionName("Edit repository URL");
decorator.setAddAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
String url = Messages.showInputDialog("Please input repository URL", "Repository URL", null);
if (!repoModel.contains(url) && !StringUtil.isEmptyOrSpaces(url)) {
repoModel.addElement(url);
PyPackageService.getInstance().addRepository(url);
}
}
});
decorator.setEditAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
final String oldValue = (String)myList.getSelectedValue();
String url = Messages.showInputDialog("Please edit repository URL", "Repository URL", null, oldValue, new InputValidator() {
@Override
public boolean checkInput(String inputString) {
return !repoModel.contains(inputString);
}
@Override
public boolean canClose(String inputString) {
return true;
}
});
if (!StringUtil.isEmptyOrSpaces(url) && !oldValue.equals(url)) {
repoModel.addElement(url);
repoModel.removeElement(oldValue);
PyPackageService.getInstance().removeRepository(oldValue);
PyPackageService.getInstance().addRepository(url);
}
}
});
decorator.setRemoveAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
String selected = (String)myList.getSelectedValue();
PyPackageService.getInstance().removeRepository(selected);
repoModel.removeElement(selected);
button.setEnabled(false);
}
});
decorator.setRemoveActionUpdater(new AnActionButtonUpdater() {
@Override
public boolean isEnabled(AnActionEvent e) {
return myEnabled;
}
});
decorator.setEditActionUpdater(new AnActionButtonUpdater() {
@Override
public boolean isEnabled(AnActionEvent e) {
return myEnabled;
}
});
final JPanel panel = decorator.createPanel();
panel.setPreferredSize(new Dimension(800, 600));
myMainPanel.add(panel);
}
@Override
protected JComponent createCenterPanel() {
return myMainPanel;
}
}

View File

@@ -1,29 +0,0 @@
package com.jetbrains.python.packaging.ui;
import com.intellij.util.CatchingConsumer;
import com.jetbrains.python.packaging.RepoPackage;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.List;
/**
* @author yole
*/
public interface PackageManagerController {
List<RepoPackage> getAllPackages() throws IOException;
void reloadPackagesList() throws IOException;
void installPackage(String packageName, String repositoryUrl, @Nullable String version, boolean installToUser,
@Nullable String extraOptions, Listener listener);
void fetchPackageVersions(String packageName, CatchingConsumer<List<String>, Exception> consumer);
void fetchPackageDetails(String packageName, CatchingConsumer<String, Exception> consumer);
interface Listener {
void installationStarted();
void installationFinished(@Nullable String errorDescription);
}
}

View File

@@ -4,6 +4,8 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.CatchingConsumer;
import com.intellij.webcore.packaging.PackageManagerController;
import com.intellij.webcore.packaging.RepoPackage;
import com.jetbrains.python.packaging.*;
import org.apache.xmlrpc.AsyncCallback;
import org.jetbrains.annotations.NonNls;
@@ -25,6 +27,29 @@ public class PyPackagesController implements PackageManagerController {
mySdk = sdk;
}
@Override
public List<String> getAllRepositories() {
List<String> result = new ArrayList<String>();
result.add(PyPIPackageUtil.PYPI_URL);
result.addAll(PyPackageService.getInstance().additionalRepositories);
return result;
}
@Override
public boolean canModifyRepository(String repositoryUrl) {
return !PyPIPackageUtil.PYPI_URL.equals(repositoryUrl);
}
@Override
public void addRepository(String repositoryUrl) {
PyPackageService.getInstance().addRepository(repositoryUrl);
}
@Override
public void removeRepository(String repositoryUrl) {
PyPackageService.getInstance().removeRepository(repositoryUrl);
}
@Override
public List<RepoPackage> getAllPackages() throws IOException {
List<RepoPackage> packages = new ArrayList<RepoPackage>();
@@ -39,10 +64,11 @@ public class PyPackagesController implements PackageManagerController {
}
@Override
public void reloadPackagesList() throws IOException {
public List<RepoPackage> reloadAllPackages() throws IOException {
final PyPackageService service = PyPackageService.getInstance();
PyPIPackageUtil.INSTANCE.updatePyPICache(service);
service.LAST_TIME_CHECKED = System.currentTimeMillis();
return getAllPackages();
}
@Override