blob: 0ae246d4171554fb28728382a36b5576518c4436 [file] [log] [blame]
/*
* Copyright 2000-2014 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.intellij.ide.plugins;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.plugins.sorters.SortByDownloadsAction;
import com.intellij.ide.plugins.sorters.SortByRatingAction;
import com.intellij.ide.plugins.sorters.SortByUpdatedAction;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
import com.intellij.openapi.application.ex.ApplicationInfoEx;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.updateSettings.impl.UpdateSettings;
import com.intellij.ui.DoubleClickListener;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.TableUtil;
import com.intellij.util.net.HttpConfigurable;
import com.intellij.util.ui.update.UiNotifyConnector;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.TreeSet;
/**
* User: anna
*/
public class AvailablePluginsManagerMain extends PluginManagerMain {
public static final String MANAGE_REPOSITORIES = "Manage repositories...";
public static final String N_A = "N/A";
private final PluginManagerMain installed;
private final String myVendorFilter;
public AvailablePluginsManagerMain(PluginManagerMain installed, PluginManagerUISettings uiSettings, String vendorFilter) {
super(uiSettings);
this.installed = installed;
myVendorFilter = vendorFilter;
init();
final JButton manageRepositoriesBtn = new JButton(MANAGE_REPOSITORIES);
if (myVendorFilter == null) {
manageRepositoriesBtn.setMnemonic('m');
manageRepositoriesBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
if (ShowSettingsUtil.getInstance().editConfigurable(myActionsPanel, new PluginHostsConfigurable())) {
final ArrayList<String> pluginHosts = UpdateSettings.getInstance().myPluginHosts;
if (!pluginHosts.contains(((AvailablePluginsTableModel)pluginsModel).getRepository())) {
((AvailablePluginsTableModel)pluginsModel).setRepository(AvailablePluginsTableModel.ALL, myFilter.getFilter().toLowerCase(Locale.ENGLISH));
}
loadAvailablePlugins();
}
}
});
myActionsPanel.add(manageRepositoriesBtn, BorderLayout.EAST);
}
final JButton httpProxySettingsButton = new JButton(IdeBundle.message("button.http.proxy.settings"));
httpProxySettingsButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
if (HttpConfigurable.editConfigurable(getMainPanel())) {
loadAvailablePlugins();
}
}
});
myActionsPanel.add(httpProxySettingsButton, BorderLayout.WEST);
myPanelDescription.setVisible(false);
}
@Override
protected JScrollPane createTable() {
AvailablePluginsTableModel model = new AvailablePluginsTableModel();
model.setVendor(myVendorFilter);
pluginsModel = model;
pluginTable = new PluginTable(pluginsModel);
return ScrollPaneFactory.createScrollPane(pluginTable);
}
@Override
protected void installTableActions() {
super.installTableActions();
new DoubleClickListener() {
@Override
protected boolean onDoubleClick(MouseEvent e) {
if (pluginTable.columnAtPoint(e.getPoint()) < 0) return false;
if (pluginTable.rowAtPoint(e.getPoint()) < 0) return false;
return installSelected(pluginTable);
}
}.installOn(pluginTable);
pluginTable.registerKeyboardAction(
new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
installSelected(pluginTable);
}
},
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),
JComponent.WHEN_FOCUSED
);
}
private boolean installSelected(PluginTable pluginTable) {
IdeaPluginDescriptor[] selection = pluginTable.getSelectedObjects();
if (selection != null) {
boolean enabled = true;
for (IdeaPluginDescriptor descr : selection) {
if (descr instanceof PluginNode) {
enabled &= !PluginManagerColumnInfo.isDownloaded((PluginNode)descr);
if (((PluginNode)descr).getStatus() == PluginNode.STATUS_INSTALLED) {
enabled &= InstalledPluginsTableModel.hasNewerVersion(descr.getPluginId());
}
}
else if (descr instanceof IdeaPluginDescriptorImpl) {
PluginId id = descr.getPluginId();
enabled &= InstalledPluginsTableModel.hasNewerVersion(id);
}
}
if (enabled) {
new ActionInstallPlugin(this, installed).install(null);
}
return true;
}
return false;
}
@Override
public void reset() {
UiNotifyConnector.doWhenFirstShown(getPluginTable(), new Runnable() {
@Override
public void run() {
loadAvailablePlugins();
}
});
super.reset();
}
@Override
protected PluginManagerMain getAvailable() {
return this;
}
@Override
protected PluginManagerMain getInstalled() {
return installed;
}
@Override
protected ActionGroup getActionGroup(boolean inToolbar) {
DefaultActionGroup actionGroup = new DefaultActionGroup();
actionGroup.add(new RefreshAction());
if (inToolbar) {
actionGroup.add(new MyFilterRepositoryAction());
actionGroup.add(new MyFilterCategoryAction());
}
else {
actionGroup.add(createSortersGroup());
actionGroup.add(Separator.getInstance());
actionGroup.add(new ActionInstallPlugin(getAvailable(), getInstalled()));
}
return actionGroup;
}
@Override
protected boolean acceptHost(String host) {
return ((AvailablePluginsTableModel)pluginsModel).isHostAccepted(host);
}
@Override
protected void propagateUpdates(List<IdeaPluginDescriptor> list) {
installed.modifyPluginsList(list); //propagate updates
}
@Override
protected DefaultActionGroup createSortersGroup() {
final DefaultActionGroup group = super.createSortersGroup();
group.addAction(new SortByDownloadsAction(pluginTable, pluginsModel));
group.addAction(new SortByRatingAction(pluginTable, pluginsModel));
group.addAction(new SortByUpdatedAction(pluginTable, pluginsModel));
return group;
}
private class MyFilterCategoryAction extends ComboBoxAction implements DumbAware{
@Override
public void update(AnActionEvent e) {
super.update(e);
String category = ((AvailablePluginsTableModel)pluginsModel).getCategory();
if (category == null) {
category = N_A;
}
e.getPresentation().setText("Category: " + category);
}
@NotNull
@Override
protected DefaultActionGroup createPopupActionGroup(JComponent button) {
final TreeSet<String> availableCategories = ((AvailablePluginsTableModel)pluginsModel).getAvailableCategories();
final DefaultActionGroup gr = new DefaultActionGroup();
gr.add(createFilterByCategoryAction(AvailablePluginsTableModel.ALL));
final boolean noCategory = availableCategories.remove(N_A);
for (final String availableCategory : availableCategories) {
gr.add(createFilterByCategoryAction(availableCategory));
}
if (noCategory) {
gr.add(createFilterByCategoryAction(N_A));
}
return gr;
}
private AnAction createFilterByCategoryAction(final String availableCategory) {
return new AnAction(availableCategory) {
@Override
public void actionPerformed(AnActionEvent e) {
final String filter = myFilter.getFilter().toLowerCase(Locale.ENGLISH);
((AvailablePluginsTableModel)pluginsModel).setCategory(availableCategory, filter);
}
};
}
}
private class MyFilterRepositoryAction extends ComboBoxAction implements DumbAware {
private static final int LENGTH = 15;
@Override
public void update(AnActionEvent e) {
super.update(e);
boolean empty = UpdateSettings.getInstance().myPluginHosts.isEmpty();
e.getPresentation().setVisible(!empty || ApplicationInfoEx.getInstanceEx().getBuiltinPluginsUrl() != null);
String repository = ((AvailablePluginsTableModel)pluginsModel).getRepository();
if (repository.length() > LENGTH) {
repository = repository.substring(0, LENGTH) + "...";
}
e.getPresentation().setText("Repository: " + repository);
}
@NotNull
@Override
protected DefaultActionGroup createPopupActionGroup(JComponent button) {
final DefaultActionGroup gr = new DefaultActionGroup();
gr.add(createFilterByRepositoryAction(AvailablePluginsTableModel.ALL));
gr.add(createFilterByRepositoryAction(AvailablePluginsTableModel.JETBRAINS_REPO));
if (ApplicationInfoEx.getInstanceEx().getBuiltinPluginsUrl() != null) {
gr.add(createFilterByRepositoryAction(AvailablePluginsTableModel.BUILTIN_REPO));
}
for (final String host : UpdateSettings.getInstance().myPluginHosts) {
gr.add(createFilterByRepositoryAction(host));
}
return gr;
}
private AnAction createFilterByRepositoryAction(final String host) {
return new AnAction(host) {
@Override
public void actionPerformed(AnActionEvent e) {
final String filter = myFilter.getFilter().toLowerCase(Locale.ENGLISH);
((AvailablePluginsTableModel)pluginsModel).setRepository(host, filter);
TableUtil.ensureSelectionExists(getPluginTable());
}
};
}
}
}