diff options
author | Remy Suen | 2010-07-22 19:22:17 +0000 |
---|---|---|
committer | Remy Suen | 2010-07-22 19:22:17 +0000 |
commit | e83268c806f686d7fe0066558bd72913c0b96945 (patch) | |
tree | 21a8660c9d9deb89e10ffbbc4b0a6ebd0e0b0087 /bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess | |
parent | 36d9f282a335bf1d4ebb0e3797591b87cb8e97e5 (diff) | |
download | eclipse.platform.ui-e83268c806f686d7fe0066558bd72913c0b96945.tar.gz eclipse.platform.ui-e83268c806f686d7fe0066558bd72913c0b96945.tar.xz eclipse.platform.ui-e83268c806f686d7fe0066558bd72913c0b96945.zip |
Bug 318211 [Compatibility] QuickAccess will execute commands in an incorrect context
Diffstat (limited to 'bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess')
13 files changed, 123 insertions, 27 deletions
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/ActionProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/ActionProvider.java index f36706f389e..1c70e8a224d 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/ActionProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/ActionProvider.java @@ -15,7 +15,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; - import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.MenuManager; @@ -90,4 +89,8 @@ public class ActionProvider extends QuickAccessProvider { public String getName() { return QuickAccessMessages.QuickAccess_Menus; } + + protected void doReset() { + idToElement = null; + } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/CommandElement.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/CommandElement.java index 36feb01efbb..3437edc89ac 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/CommandElement.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/CommandElement.java @@ -48,7 +48,7 @@ public class CommandElement extends QuickAccessElement { Object o = getProvider(); if (o instanceof CommandProvider) { CommandProvider provider = (CommandProvider) o; - if (provider.getHandlerService()!=null) { + if (provider.getHandlerService() != null && provider.getContextSnapshot() != null) { try { provider.getHandlerService().executeCommandInContext( command, null, provider.getContextSnapshot()); diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/CommandProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/CommandProvider.java index a01bb5776f3..2ab99ae8bab 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/CommandProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/CommandProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2008 IBM Corporation and others. + * Copyright (c) 2006, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,12 +10,10 @@ *******************************************************************************/ package org.eclipse.ui.internal.quickaccess; - import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; - import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.core.commands.common.NotDefinedException; @@ -33,14 +31,17 @@ import org.eclipse.ui.internal.WorkbenchImages; */ public class CommandProvider extends QuickAccessProvider { + private IEvaluationContext currentSnapshot; + + void setSnapshot(IEvaluationContext c) { + reset(); + currentSnapshot = c; + } + private Map idToElement; - private IEvaluationContext contextSnapshot; private IHandlerService handlerService; public CommandProvider() { - // initialize eagerly - saveApplicationContext(); - getElements(); } public String getId() { @@ -94,16 +95,20 @@ public class CommandProvider extends QuickAccessProvider { return QuickAccessMessages.QuickAccess_Commands; } - private void saveApplicationContext() { - handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class); - contextSnapshot = handlerService.createContextSnapshot(true); - } - IHandlerService getHandlerService() { + if (handlerService == null) { + handlerService = (IHandlerService) PlatformUI.getWorkbench().getService( + IHandlerService.class); + } return handlerService; } IEvaluationContext getContextSnapshot() { - return contextSnapshot; + return currentSnapshot; + } + + protected void doReset() { + idToElement = null; + currentSnapshot = null; } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/EditorProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/EditorProvider.java index c5cb8be3994..bacddedf2f5 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/EditorProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/EditorProvider.java @@ -13,7 +13,6 @@ package org.eclipse.ui.internal.quickaccess; import java.util.HashMap; import java.util.Map; - import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; @@ -65,4 +64,8 @@ public class EditorProvider extends QuickAccessProvider { public String getName() { return QuickAccessMessages.QuickAccess_Editors; } + + protected void doReset() { + idToElement = null; + } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PerspectiveProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PerspectiveProvider.java index 64db59c784c..8c260f94159 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PerspectiveProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PerspectiveProvider.java @@ -13,7 +13,6 @@ package org.eclipse.ui.internal.quickaccess; import java.util.HashMap; import java.util.Map; - import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IPerspectiveDescriptor; import org.eclipse.ui.ISharedImages; @@ -61,4 +60,9 @@ public class PerspectiveProvider extends QuickAccessProvider { public String getName() { return QuickAccessMessages.QuickAccess_Perspectives; } + + protected void doReset() { + cachedElements = null; + idToElement = new HashMap(); + } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PreferenceProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PreferenceProvider.java index 68dc070ee65..dba5e0547d2 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PreferenceProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PreferenceProvider.java @@ -15,7 +15,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; - import org.eclipse.jface.preference.IPreferenceNode; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.PlatformUI; @@ -76,4 +75,9 @@ public class PreferenceProvider extends QuickAccessProvider { public String getName() { return QuickAccessMessages.QuickAccess_Preferences; } + + protected void doReset() { + cachedElements = null; + idToElement = new HashMap(); + } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PropertiesProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PropertiesProvider.java index 81b6f0134e2..ec541ab5bcb 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PropertiesProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/PropertiesProvider.java @@ -14,7 +14,6 @@ package org.eclipse.ui.internal.quickaccess; import java.util.HashMap; import java.util.List; import java.util.Map; - import org.eclipse.jface.preference.IPreferenceNode; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.resource.ImageDescriptor; @@ -83,4 +82,8 @@ public class PropertiesProvider extends QuickAccessProvider { public String getName() { return QuickAccessMessages.QuickAccess_Properties; } + + protected void doReset() { + idToElement = null; + } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessContents.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessContents.java index 6deb5bfd67f..9a40bf446d9 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessContents.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessContents.java @@ -504,4 +504,13 @@ public abstract class QuickAccessContents { return table; } + /** + * + */ + public void resetProviders() { + for (QuickAccessProvider provider : providers) { + provider.reset(); + } + } + } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessDialog.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessDialog.java index cb84bb268e4..d3771e44675 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessDialog.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessDialog.java @@ -414,6 +414,9 @@ public class QuickAccessDialog extends PopupDialog { // TODO Auto-generated method stub return true; } + + protected void doReset() { + } } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessProvider.java index c2598a4a824..921b6a1af87 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/QuickAccessProvider.java @@ -78,4 +78,11 @@ public abstract class QuickAccessProvider { public boolean isAlwaysPresent() { return false; } + + public void reset() { + sortedElements = null; + doReset(); + } + + protected abstract void doReset(); } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/SearchField.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/SearchField.java index d00aadcd026..3b0eaec26c7 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/SearchField.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/SearchField.java @@ -8,14 +8,16 @@ * Contributors: * IBM Corporation - initial API and implementation ******************************************************************************/ - package org.eclipse.ui.internal.quickaccess; import javax.annotation.PostConstruct; +import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; @@ -26,13 +28,18 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.handlers.IHandlerService; public class SearchField { Shell shell; + private QuickAccessContents quickAccessContents; + private MWindow window; @PostConstruct - void createWidget(final Composite parent) { + void createWidget(final Composite parent, MWindow window) { + this.window = window; // borderColor = new Color(parent.getDisplay(), 170, 176, 191); final Composite comp = new Composite(parent, SWT.NONE); comp.setLayout(new GridLayout()); @@ -40,11 +47,12 @@ public class SearchField { GridDataFactory.fillDefaults().hint(100, SWT.DEFAULT).applyTo(text); text.setMessage(QuickAccessMessages.QuickAccess_EnterSearch); + final CommandProvider commandProvider = new CommandProvider(); QuickAccessProvider[] providers = new QuickAccessProvider[] { new EditorProvider(), - new ViewProvider(), new PerspectiveProvider(), new CommandProvider(), + new ViewProvider(), new PerspectiveProvider(), commandProvider, new ActionProvider(), new WizardProvider(), new PreferenceProvider(), new PropertiesProvider() }; - QuickAccessContents quickAccessContents = new QuickAccessContents(providers) { + quickAccessContents = new QuickAccessContents(providers) { void updateFeedback(boolean filterTextEmpty, boolean showAllMatches) { } @@ -74,7 +82,28 @@ public class SearchField { } }); GridLayoutFactory.fillDefaults().applyTo(shell); - quickAccessContents.createTable(shell, Window.getDefaultOrientation()); + final Table table = quickAccessContents.createTable(shell, Window.getDefaultOrientation()); + text.addFocusListener(new FocusListener() { + public void focusLost(FocusEvent e) { + checkFocusLost(table, text); + } + + public void focusGained(FocusEvent e) { + IHandlerService hs = SearchField.this.window.getContext() + .get(IHandlerService.class); + if (commandProvider.getContextSnapshot() == null) { + commandProvider.setSnapshot(hs.createContextSnapshot(true)); + } + } + }); + shell.addFocusListener(new FocusListener() { + public void focusLost(FocusEvent e) { + checkFocusLost(table, text); + } + + public void focusGained(FocusEvent e) { + } + }); text.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { boolean wasVisible = shell.getVisible(); @@ -109,6 +138,24 @@ public class SearchField { } }); + } -} + /** + * @param table + * @param text + */ + protected void checkFocusLost(final Table table, final Text text) { + table.getDisplay().asyncExec(new Runnable() { + public void run() { + if (!table.isDisposed() && !text.isDisposed()) { + if (!table.isFocusControl() && !text.isFocusControl()) { + text.setText(""); //$NON-NLS-1$ + quickAccessContents.resetProviders(); + } + } + } + }); + } + +} diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/ViewProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/ViewProvider.java index b1aa68614af..6d201fbce68 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/ViewProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/ViewProvider.java @@ -13,7 +13,6 @@ package org.eclipse.ui.internal.quickaccess; import java.util.HashMap; import java.util.Map; - import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.IWorkbenchGraphicConstants; @@ -65,4 +64,9 @@ public class ViewProvider extends QuickAccessProvider { public String getName() { return QuickAccessMessages.QuickAccess_Views; } + + protected void doReset() { + cachedElements = null; + idToElement = new HashMap(); + } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/WizardProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/WizardProvider.java index 1d6e8ff1ac7..b10101a4868 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/WizardProvider.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/WizardProvider.java @@ -16,7 +16,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; - import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.internal.IWorkbenchGraphicConstants; import org.eclipse.ui.internal.WorkbenchImages; @@ -76,4 +75,9 @@ public class WizardProvider extends QuickAccessProvider { public String getName() { return QuickAccessMessages.QuickAccess_New; } + + protected void doReset() { + cachedElements = null; + idToElement = new HashMap(); + } } |