diff --git a/platform/core-api/src/com/intellij/ui/IconDeferrer.java b/platform/core-api/src/com/intellij/ui/IconDeferrer.java index 120f5aadaba8..b5b5c46932a0 100644 --- a/platform/core-api/src/com/intellij/ui/IconDeferrer.java +++ b/platform/core-api/src/com/intellij/ui/IconDeferrer.java @@ -31,4 +31,5 @@ public abstract class IconDeferrer { } public abstract Icon defer(Icon base, T param, @NotNull Function f); + public abstract Icon deferAutoUpdatable(Icon base, T param, @NotNull Function f); } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/execution/RunManagerEx.java b/platform/lang-impl/src/com/intellij/execution/RunManagerEx.java index 5f93561d1596..b26ab384040b 100644 --- a/platform/lang-impl/src/com/intellij/execution/RunManagerEx.java +++ b/platform/lang-impl/src/com/intellij/execution/RunManagerEx.java @@ -74,7 +74,6 @@ public abstract class RunManagerEx extends RunManager { public abstract RunnerAndConfigurationSettings findConfigurationByName(@Nullable final String name); public abstract Icon getConfigurationIcon(@NotNull RunnerAndConfigurationSettings settings); - public abstract void invalidateConfigurationIcon(@NotNull RunnerAndConfigurationSettings settings); @NotNull public abstract Collection getSortedConfigurations(); diff --git a/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java b/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java index c323e8e6281f..662158a4ceda 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java @@ -127,6 +127,7 @@ public class RunConfigurationsComboBoxAction extends ComboBoxAction implements D final RunnerAndConfigurationSettings settings, final Project project) { try { + presentation.setIcon(null);//Hack for same DeferredIcon with new "recalculated" delegate icon inside (events won't pass) presentation.setIcon(RunManagerEx.getInstanceEx(project).getConfigurationIcon(settings)); } catch (IndexNotReadyException ignored) { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java index b5d1a1de73c4..fae1367302a9 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java @@ -396,11 +396,6 @@ class RunConfigurable extends BaseConfigurable { myRightPanel.add(((SingleConfigurationConfigurable)configurable).getValidationComponent(), BorderLayout.SOUTH); } - if (configurable instanceof SingleConfigurationConfigurable) { - RunManagerEx.getInstanceEx(myProject) - .invalidateConfigurationIcon((RunnerAndConfigurationSettings)((SingleConfigurationConfigurable)configurable).getSettings()); - } - setupDialogBounds(); } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java index 5aace3ca655d..d09a236a76de 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java @@ -425,7 +425,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, mySharedConfigurations.remove(settings.getUniqueID()); myConfigurationToBeforeTasksMap.remove(settings.getConfiguration()); myRecentlyUsedTemporaries.remove(settings.getConfiguration()); - invalidateConfigurationIcon(configuration); myDispatcher.getMulticaster().runConfigurationRemoved(configuration); break; } @@ -444,9 +443,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, @Override public void setSelectedConfiguration(@Nullable RunnerAndConfigurationSettings settings) { setSelectedConfigurationId(settings == null ? null : settings.getUniqueID()); - if (settings != null) { - invalidateConfigurationIcon(settings); - } fireRunConfigurationSelected(); } @@ -897,7 +893,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, if (tempConfiguration == null) return; tempConfiguration.setTemporary(true); - invalidateConfigurationIcon(tempConfiguration); addConfiguration(tempConfiguration, isConfigurationShared(tempConfiguration), getBeforeRunTasks(tempConfiguration.getConfiguration()), false); @@ -950,7 +945,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, } public void makeStable(@NotNull RunnerAndConfigurationSettings settings) { - invalidateConfigurationIcon(settings); settings.setTemporary(false); myRecentlyUsedTemporaries.remove(settings.getConfiguration()); if (!myOrder.isEmpty()) { @@ -1012,11 +1006,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, return tasks; } - @Override - public void invalidateConfigurationIcon(@NotNull final RunnerAndConfigurationSettings settings) { - myIdToIcon.remove(settings.getUniqueID()); - } - @Override public Icon getConfigurationIcon(@NotNull final RunnerAndConfigurationSettings settings) { final String uniqueID = settings.getUniqueID(); @@ -1032,10 +1021,10 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, } Icon icon = myIdToIcon.get(uniqueID); if (icon == null) { - icon = IconDeferrer.getInstance().defer(settings.getConfiguration().getIcon(), Pair.create(myProject, settings), - new Function, Icon>() { + icon = IconDeferrer.getInstance().deferAutoUpdatable(settings.getConfiguration().getIcon(), myProject.hashCode() ^ settings.hashCode(), + new Function() { @Override - public Icon fun(Pair projectRunnerAndConfigurationSettingsPair) { + public Icon fun(Integer param) { if (myProject.isDisposed()) return null; myIconCalcTime.remove(uniqueID); @@ -1189,7 +1178,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, final RunnerAndConfigurationSettings settings = entry.getValue(); if (!settings.isTemplate() && isConfigurationShared(settings) && !existing.contains(settings.getUniqueID())) { removed.add(settings); - invalidateConfigurationIcon(settings); it.remove(); } } @@ -1197,7 +1185,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, } public void fireRunConfigurationChanged(@NotNull RunnerAndConfigurationSettings settings) { - invalidateConfigurationIcon(settings); myDispatcher.getMulticaster().runConfigurationChanged(settings); } diff --git a/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java b/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java index 7e5b6541f737..9969c66ee51a 100644 --- a/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -45,6 +45,7 @@ import java.util.LinkedHashSet; import java.util.Set; public class DeferredIconImpl implements DeferredIcon { + private static final int MIN_AUTO_UPDATE_MILLIS = 950; private static final RepaintScheduler ourRepaintScheduler = new RepaintScheduler(); @NotNull private volatile Icon myDelegateIcon; @@ -54,6 +55,9 @@ public class DeferredIconImpl implements DeferredIcon { private static final Icon EMPTY_ICON = EmptyIcon.ICON_16; private final boolean myNeedReadAction; private boolean myDone; + private final boolean myAutoUpdatable; + private long myLastCalcTime = 0L; + private long myLastTimeSpent = 0L; private final IconListener myEvalListener; private static final TransferToEDTQueue ourLaterInvocator = new TransferToEDTQueue("Deferred icon later invocator", new Processor() { @@ -64,19 +68,21 @@ public class DeferredIconImpl implements DeferredIcon { } }, Condition.FALSE, 200); - DeferredIconImpl(Icon baseIcon, T param, @NotNull Function evaluator, @NotNull IconListener listener) { - this(baseIcon, param, true, evaluator, listener); + public DeferredIconImpl(Icon baseIcon, T param, @NotNull Function evaluator, @NotNull IconListener listener, boolean autoUpdatable) { + this(baseIcon, param, true, evaluator, listener, autoUpdatable); } public DeferredIconImpl(Icon baseIcon, T param, final boolean needReadAction, @NotNull Function evaluator) { - this(baseIcon, param, needReadAction, evaluator, null); + this(baseIcon, param, needReadAction, evaluator, null, false); } - private DeferredIconImpl(Icon baseIcon, T param, final boolean needReadAction, @NotNull Function evaluator, IconListener listener) { + + private DeferredIconImpl(Icon baseIcon, T param, boolean needReadAction, final Function evaluator, IconListener listener, boolean autoUpdatable) { myParam = param; myDelegateIcon = nonNull(baseIcon); myEvaluator = evaluator; myNeedReadAction = needReadAction; myEvalListener = listener; + myAutoUpdatable = autoUpdatable; } @NotNull @@ -90,7 +96,7 @@ public class DeferredIconImpl implements DeferredIcon { myDelegateIcon.paintIcon(c, g, x, y); //SOE protection } - if (myIsScheduled || isDone() || PowerSaveMode.isEnabled()) { + if (isDone() || myIsScheduled || PowerSaveMode.isEnabled()) { return; } myIsScheduled = true; @@ -119,11 +125,16 @@ public class DeferredIconImpl implements DeferredIcon { } }; + final long startTime = System.currentTimeMillis(); if (myNeedReadAction) { if (!ApplicationManagerEx.getApplicationEx().tryRunReadAction(new Runnable() { @Override public void run() { IconDeferrerImpl.evaluateDeferred(evalRunnable); + if (myAutoUpdatable) { + myLastCalcTime = System.currentTimeMillis(); + myLastTimeSpent = myLastCalcTime - startTime; + } } })) { myIsScheduled = false; @@ -132,6 +143,10 @@ public class DeferredIconImpl implements DeferredIcon { } else { IconDeferrerImpl.evaluateDeferred(evalRunnable); + if (myAutoUpdatable) { + myLastCalcTime = System.currentTimeMillis(); + myLastTimeSpent = myLastCalcTime - startTime; + } } final Icon result = evaluated[0]; myDelegateIcon = result; @@ -215,8 +230,10 @@ public class DeferredIconImpl implements DeferredIcon { } myDone = true; - myEvaluator = null; - myParam = null; + if (!myAutoUpdatable) { + myEvaluator = null; + myParam = null; + } } @NotNull @@ -271,6 +288,10 @@ public class DeferredIconImpl implements DeferredIcon { } public boolean isDone() { + if (myAutoUpdatable && myDone && myLastCalcTime > 0 && (System.currentTimeMillis() - myLastCalcTime) > Math.max(MIN_AUTO_UPDATE_MILLIS, 10 * myLastTimeSpent)) { + myDone = false; + myIsScheduled = false; + } return myDone; } diff --git a/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java b/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java index f0ca2cc4e68a..7d6f25e1365c 100644 --- a/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2009 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. @@ -74,6 +74,15 @@ public class IconDeferrerImpl extends IconDeferrer { @Override public Icon defer(final Icon base, final T param, @NotNull final Function f) { + return deferImpl(base, param, f, false); + } + + @Override + public Icon deferAutoUpdatable(Icon base, T param, @NotNull Function f) { + return deferImpl(base, param, f, true); + } + + private Icon deferImpl(Icon base, T param, @NotNull Function f, boolean autoupdatable) { if (myEvaluationIsInProgress.get().booleanValue()) { return f.fun(param); } @@ -92,7 +101,7 @@ public class IconDeferrerImpl extends IconDeferrer { } } } - }); + }, autoupdatable); myIconsCache.put(param, result); } diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java index a40634fbf045..d93bc12cac3f 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java @@ -369,7 +369,7 @@ public abstract class ComboBoxAction extends AnAction implements CustomComponent final Icon icon = getIcon(); int x = 7; if (icon != null) { - icon.paintIcon(null, g, x, (size.height - icon.getIconHeight()) / 2); + icon.paintIcon(this, g, x, (size.height - icon.getIconHeight()) / 2); x += icon.getIconWidth() + 3; } if (!StringUtil.isEmpty(getText())) { @@ -404,7 +404,7 @@ public abstract class ComboBoxAction extends AnAction implements CustomComponent final Icon icon = getIcon(); int x = 7; if (icon != null) { - icon.paintIcon(null, g, x, (size.height - icon.getIconHeight()) / 2); + icon.paintIcon(this, g, x, (size.height - icon.getIconHeight()) / 2); x += icon.getIconWidth() + 3; } if (!StringUtil.isEmpty(getText())) { diff --git a/platform/platform-api/src/com/intellij/ui/DefaultIconDeferrer.java b/platform/platform-api/src/com/intellij/ui/DefaultIconDeferrer.java index cd437ac61f66..77cdec574ef0 100644 --- a/platform/platform-api/src/com/intellij/ui/DefaultIconDeferrer.java +++ b/platform/platform-api/src/com/intellij/ui/DefaultIconDeferrer.java @@ -29,4 +29,9 @@ public class DefaultIconDeferrer extends IconDeferrer { public Icon defer(final Icon base, final T param, @NotNull final Function f) { return f.fun(param); } + + @Override + public Icon deferAutoUpdatable(Icon base, T param, @NotNull Function f) { + return f.fun(param); + } } \ No newline at end of file diff --git a/platform/testFramework/src/com/intellij/mock/MockRunManager.java b/platform/testFramework/src/com/intellij/mock/MockRunManager.java index 922333713b1d..b0797c7f53b4 100644 --- a/platform/testFramework/src/com/intellij/mock/MockRunManager.java +++ b/platform/testFramework/src/com/intellij/mock/MockRunManager.java @@ -187,10 +187,6 @@ public class MockRunManager extends RunManagerEx { return null; } - @Override - public void invalidateConfigurationIcon(@NotNull RunnerAndConfigurationSettings settings) { - } - @Override @NotNull public Collection getSortedConfigurations() {