blob: b35899eeda114afa3a8f0d2396262c78d3868a15 [file] [log] [blame]
package com.intellij.remoteServer.impl.configuration;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonShortcuts;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.OptionalConfigurable;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.ui.MasterDetailsComponent;
import com.intellij.openapi.ui.NamedConfigurable;
import com.intellij.openapi.util.Condition;
import com.intellij.remoteServer.ServerType;
import com.intellij.remoteServer.configuration.RemoteServer;
import com.intellij.remoteServer.configuration.RemoteServersManager;
import com.intellij.util.IconUtil;
import com.intellij.util.text.UniqueNameGenerator;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author nik
*/
public class RemoteServerListConfigurable extends MasterDetailsComponent implements OptionalConfigurable, SearchableConfigurable {
private final RemoteServersManager myServersManager;
@Nullable private final ServerType<?> myServerType;
private RemoteServer<?> myLastSelectedServer;
public RemoteServerListConfigurable(@NotNull RemoteServersManager manager) {
this(manager, null);
}
private RemoteServerListConfigurable(@NotNull RemoteServersManager manager, @Nullable ServerType<?> type) {
myServersManager = manager;
myServerType = type;
initTree();
}
public static RemoteServerListConfigurable createConfigurable(@NotNull ServerType<?> type) {
return new RemoteServerListConfigurable(RemoteServersManager.getInstance(), type);
}
@Nls
@Override
public String getDisplayName() {
return "Clouds";
}
@Override
public void reset() {
myRoot.removeAllChildren();
List<RemoteServer<?>> servers = getServers();
for (RemoteServer<?> server : servers) {
addServerNode(server, false);
}
super.reset();
}
private List<RemoteServer<?>> getServers() {
if (myServerType == null) {
return myServersManager.getServers();
}
else {
//code won't compile without this ugly cast (at least in jdk 1.6)
return (List<RemoteServer<?>>)((List)myServersManager.getServers(myServerType));
}
}
private MyNode addServerNode(RemoteServer<?> server, boolean isNew) {
MyNode node = new MyNode(new RemoteServerConfigurable(server, TREE_UPDATER, isNew));
addNode(node, myRoot);
return node;
}
@NotNull
@Override
public String getId() {
return "RemoteServers";
}
@Nullable
@Override
public Runnable enableSearch(String option) {
return null;
}
@Override
protected void processRemovedItems() {
Set<RemoteServer<?>> servers = new HashSet<RemoteServer<?>>();
for (NamedConfigurable<RemoteServer<?>> configurable : getConfiguredServers()) {
servers.add(configurable.getEditableObject());
}
List<RemoteServer<?>> toDelete = new ArrayList<RemoteServer<?>>();
for (RemoteServer<?> server : getServers()) {
if (!servers.contains(server)) {
toDelete.add(server);
}
}
for (RemoteServer<?> server : toDelete) {
myServersManager.removeServer(server);
}
}
@Override
public void apply() throws ConfigurationException {
super.apply();
Set<RemoteServer<?>> servers = new HashSet<RemoteServer<?>>(getServers());
for (NamedConfigurable<RemoteServer<?>> configurable : getConfiguredServers()) {
RemoteServer<?> server = configurable.getEditableObject();
server.setName(configurable.getDisplayName());
if (!servers.contains(server)) {
myServersManager.addServer(server);
}
}
}
@Nullable
@Override
protected ArrayList<AnAction> createActions(boolean fromPopup) {
ArrayList<AnAction> actions = new ArrayList<AnAction>();
if (myServerType == null) {
actions.add(new AddRemoteServerGroup());
}
else {
actions.add(new AddRemoteServerAction(myServerType, IconUtil.getAddIcon()));
}
actions.add(new MyDeleteAction());
return actions;
}
@Override
public boolean needDisplay() {
return ServerType.EP_NAME.getExtensions().length > 0;
}
@Override
protected boolean wasObjectStored(Object editableObject) {
return true;
}
@Override
public void disposeUIResources() {
Object selectedObject = getSelectedObject();
myLastSelectedServer = selectedObject instanceof RemoteServer<?> ? (RemoteServer)selectedObject : null;
super.disposeUIResources();
}
@Nullable
public RemoteServer<?> getLastSelectedServer() {
return myLastSelectedServer;
}
private List<NamedConfigurable<RemoteServer<?>>> getConfiguredServers() {
List<NamedConfigurable<RemoteServer<?>>> configurables = new ArrayList<NamedConfigurable<RemoteServer<?>>>();
for (int i = 0; i < myRoot.getChildCount(); i++) {
MyNode node = (MyNode)myRoot.getChildAt(i);
configurables.add((NamedConfigurable<RemoteServer<?>>)node.getConfigurable());
}
return configurables;
}
private class AddRemoteServerGroup extends ActionGroup implements ActionGroupWithPreselection {
private AddRemoteServerGroup() {
super("Add", "", IconUtil.getAddIcon());
registerCustomShortcutSet(CommonShortcuts.INSERT, myTree);
}
@NotNull
@Override
public AnAction[] getChildren(@Nullable AnActionEvent e) {
ServerType[] serverTypes = ServerType.EP_NAME.getExtensions();
AnAction[] actions = new AnAction[serverTypes.length];
for (int i = 0; i < serverTypes.length; i++) {
actions[i] = new AddRemoteServerAction(serverTypes[i], serverTypes[i].getIcon());
}
return actions;
}
@Override
public ActionGroup getActionGroup() {
return this;
}
@Override
public int getDefaultIndex() {
return 0;
}
}
private class AddRemoteServerAction extends DumbAwareAction {
private final ServerType<?> myServerType;
private AddRemoteServerAction(ServerType<?> serverType, final Icon icon) {
super(serverType.getPresentableName(), null, icon);
myServerType = serverType;
}
@Override
public void actionPerformed(AnActionEvent e) {
String name = UniqueNameGenerator.generateUniqueName(myServerType.getPresentableName(), new Condition<String>() {
@Override
public boolean value(String s) {
for (NamedConfigurable<RemoteServer<?>> configurable : getConfiguredServers()) {
if (configurable.getDisplayName().equals(s)) {
return false;
}
}
return true;
}
});
MyNode node = addServerNode(myServersManager.createServer(myServerType, name), true);
selectNodeInTree(node);
}
}
}