run configurations optimization

This commit is contained in:
anna
2010-06-23 19:24:27 +04:00
parent 22c499b910
commit 6470f10bf3
7 changed files with 75 additions and 15 deletions
@@ -25,6 +25,7 @@ import com.intellij.execution.configurations.RuntimeConfiguration;
import com.intellij.execution.junit.RuntimeConfigurationProducer;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKey;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.diagnostic.Logger;
@@ -32,6 +33,7 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
@@ -46,11 +48,26 @@ public class ConfigurationContext {
private static final Logger LOG = Logger.getInstance("#com.intellij.execution.actions.ConfigurationContext");
private final Location<PsiElement> myLocation;
private RunnerAndConfigurationSettings myConfiguration;
private Ref<RunnerAndConfigurationSettings> myExistingConfiguration;
private final Module myModule;
private final RuntimeConfiguration myRuntimeConfiguration;
private final Component myContextComponent;
public ConfigurationContext(final DataContext dataContext) {
public static DataKey<ConfigurationContext> SHARED_CONTEXT = DataKey.create("SHARED_CONTEXT");
private List<RuntimeConfigurationProducer> myPreferredProducers;
public static ConfigurationContext getFromContext(DataContext dataContext) {
final ConfigurationContext context = new ConfigurationContext(dataContext);
final DataManager dataManager = DataManager.getInstance();
ConfigurationContext sharedContext = dataManager.loadFromDataContext(dataContext, SHARED_CONTEXT);
if (sharedContext == null || !Comparing.equal(sharedContext.getLocation().getPsiElement(), context.getLocation().getPsiElement())) {
sharedContext = context;
dataManager.saveInDataContext(dataContext, SHARED_CONTEXT, sharedContext);
}
return sharedContext;
}
private ConfigurationContext(final DataContext dataContext) {
myRuntimeConfiguration = RuntimeConfiguration.DATA_KEY.getData(dataContext);
myContextComponent = PlatformDataKeys.CONTEXT_COMPONENT.getData(dataContext);
myModule = LangDataKeys.MODULE.getData(dataContext);
@@ -98,23 +115,29 @@ public class ConfigurationContext {
@Nullable
public RunnerAndConfigurationSettings findExisting() {
if (myExistingConfiguration != null) return myExistingConfiguration.get();
myExistingConfiguration = new Ref<RunnerAndConfigurationSettings>();
if (myLocation == null) {
return null;
}
final List<RuntimeConfigurationProducer> producers = PreferedProducerFind.findPreferredProducers(myLocation, this, true);
final List<RuntimeConfigurationProducer> producers = findPreferredProducers();
if (producers == null) return null;
if (myRuntimeConfiguration != null) {
for (RuntimeConfigurationProducer producer : producers) {
final RunnerAndConfigurationSettings configuration = producer.findExistingConfiguration(myLocation, this);
if (configuration != null && configuration.getConfiguration() == myRuntimeConfiguration) return configuration;
if (configuration != null && configuration.getConfiguration() == myRuntimeConfiguration) {
myExistingConfiguration.set(configuration);
}
}
}
for (RuntimeConfigurationProducer producer : producers) {
final RunnerAndConfigurationSettings configuration = producer.findExistingConfiguration(myLocation, this);
if (configuration != null) return configuration;
if (configuration != null) {
myExistingConfiguration.set(configuration);
}
}
return null;
return myExistingConfiguration.get();
}
@Nullable
@@ -157,4 +180,12 @@ public class ConfigurationContext {
public RuntimeConfiguration getOriginalConfiguration(final ConfigurationType type) {
return myRuntimeConfiguration != null && Comparing.strEqual(type.getId(), myRuntimeConfiguration.getType().getId()) ? myRuntimeConfiguration : null;
}
@Nullable
public List<RuntimeConfigurationProducer> findPreferredProducers() {
if (myPreferredProducers == null) {
myPreferredProducers = PreferedProducerFind.findPreferredProducers(myLocation, this, true);
}
return myPreferredProducers;
}
}
@@ -59,7 +59,7 @@ public abstract class BaseRunConfigurationAction extends ActionGroup {
}
private AnAction[] getChildren(DataContext dataContext) {
final ConfigurationContext context = new ConfigurationContext(dataContext);
final ConfigurationContext context = ConfigurationContext.getFromContext(dataContext);
final RunnerAndConfigurationSettings existing = context.findExisting();
if (existing == null) {
final List<RuntimeConfigurationProducer> producers = getEnabledProducers(context);
@@ -87,7 +87,7 @@ public abstract class BaseRunConfigurationAction extends ActionGroup {
@NotNull
private List<RuntimeConfigurationProducer> getEnabledProducers(ConfigurationContext context) {
final List<RuntimeConfigurationProducer> preferred = PreferedProducerFind.findPreferredProducers(context.getLocation(), context, true);
final List<RuntimeConfigurationProducer> preferred = context.findPreferredProducers();
if (preferred == null) {
return Collections.emptyList();
}
@@ -107,7 +107,7 @@ public abstract class BaseRunConfigurationAction extends ActionGroup {
@Override
public boolean canBePerformed(DataContext dataContext) {
final ConfigurationContext context = new ConfigurationContext(dataContext);
final ConfigurationContext context = ConfigurationContext.getFromContext(dataContext);
final RunnerAndConfigurationSettings existing = context.findExisting();
if (existing == null) {
final List<RuntimeConfigurationProducer> producers = getEnabledProducers(context);
@@ -118,11 +118,11 @@ public abstract class BaseRunConfigurationAction extends ActionGroup {
public void actionPerformed(final AnActionEvent e) {
final DataContext dataContext = e.getDataContext();
final ConfigurationContext context = new ConfigurationContext(dataContext);
final ConfigurationContext context = ConfigurationContext.getFromContext(dataContext);
final RunnerAndConfigurationSettings existing = context.findExisting();
if (existing == null) {
final List<RuntimeConfigurationProducer> producers = PreferedProducerFind.findPreferredProducers(context.getLocation(), context, true);
if (producers == null) return;
final List<RuntimeConfigurationProducer> producers = getEnabledProducers(context);
if (producers.isEmpty()) return;
if (producers.size() > 1) {
final Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
Collections.sort(producers, new Comparator<RuntimeConfigurationProducer>() {
@@ -173,7 +173,7 @@ public abstract class BaseRunConfigurationAction extends ActionGroup {
protected abstract void perform(ConfigurationContext context);
public void update(final AnActionEvent event){
final ConfigurationContext context = new ConfigurationContext(event.getDataContext());
final ConfigurationContext context = ConfigurationContext.getFromContext(event.getDataContext());
final Presentation presentation = event.getPresentation();
RunnerAndConfigurationSettings configuration;
try {
@@ -525,7 +525,7 @@ public class ChooseRunConfigurationAction extends AnAction {
final ArrayList<RunnerAndConfigurationSettings> contextConfigurations = new ArrayList<RunnerAndConfigurationSettings>();
final DataContext dataContext = DataManager.getInstance().getDataContext();
final ConfigurationContext context = new ConfigurationContext(dataContext);
final ConfigurationContext context = ConfigurationContext.getFromContext(dataContext);
final List<RuntimeConfigurationProducer> producers = PreferedProducerFind.findPreferredProducers(context.getLocation(), context, false);
if (producers == null) return Collections.emptyList();
@@ -70,7 +70,7 @@ public class CreateAction extends BaseRunConfigurationAction {
}
protected void updateIcon(final Presentation presentation, final ConfigurationContext context) {
final List<RuntimeConfigurationProducer> producers = PreferedProducerFind.findPreferredProducers(context.getLocation(), context, true);
final List<RuntimeConfigurationProducer> producers = context.findPreferredProducers();
if (producers != null && producers.size() == 1) { //hide fuzzy icon when multiple run configurations are possible
presentation.setIcon(context.getConfiguration().getFactory().getIcon());
}
@@ -16,6 +16,7 @@
package com.intellij.ide;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKey;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.AsyncResult;
import org.jetbrains.annotations.NonNls;
@@ -52,4 +53,7 @@ public abstract class DataManager {
* component's bounds
*/
public abstract DataContext getDataContext(@NotNull Component component, int x, int y);
public abstract <T> void saveInDataContext(DataContext dataContext, DataKey<T> dataKey, T data);
public abstract <T> T loadFromDataContext(DataContext dataContext, DataKey<T> dataKey);
}
@@ -32,6 +32,7 @@ import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.util.KeyedLazyInstanceEP;
import com.intellij.util.StringSetSpinAllocator;
import com.intellij.util.containers.WeakHashMap;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -279,12 +280,21 @@ public class DataManagerImpl extends DataManager implements ApplicationComponent
return "DataManager";
}
public <T> void saveInDataContext(DataContext dataContext, DataKey<T> dataKey, T data) {
((MyDataContext)dataContext).save(dataKey, data);
}
public <T> T loadFromDataContext(DataContext dataContext, DataKey<T> dataKey) {
return ((MyDataContext)dataContext).load(dataKey);
}
public class MyDataContext implements DataContext {
private int myEventCount;
// To prevent memory leak we have to wrap passed component into
// the weak reference. For example, Swing often remembers menu items
// that have DataContext as a field.
private final WeakReference<Component> myRef;
private WeakHashMap<DataKey, Object> mySavedData;
public MyDataContext(final Component component) {
myEventCount = -1;
@@ -347,6 +357,22 @@ public class DataManagerImpl extends DataManager implements ApplicationComponent
public String toString() {
return "component=" + String.valueOf(myRef.get());
}
public <T> void save(DataKey<T> dataKey, T data) {
getOrCreateMap().put(dataKey, data);
}
private WeakHashMap<DataKey, Object> getOrCreateMap() {
if (mySavedData == null) {
mySavedData = new WeakHashMap<DataKey, Object>();
}
return mySavedData;
}
public <T> T load(DataKey<T> dataKey) {
return (T)getOrCreateMap().get(dataKey);
}
}
}
@@ -40,7 +40,6 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.*;
import java.util.List;
public class TestsUIUtil {