Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgreen2011-06-20 18:40:28 +0000
committerdgreen2011-06-20 18:40:28 +0000
commitd60f5831641804ae8f583418ba5c0236d650e916 (patch)
tree5b1ca8885da187ec6264ed7a394684ca558e1265
parentae2bf76c729d1a32fd4efb6a4abf5c0bff074d64 (diff)
downloadorg.eclipse.mylyn.incubator-d60f5831641804ae8f583418ba5c0236d650e916.tar.gz
org.eclipse.mylyn.incubator-d60f5831641804ae8f583418ba5c0236d650e916.tar.xz
org.eclipse.mylyn.incubator-d60f5831641804ae8f583418ba5c0236d650e916.zip
349351: [search] enhance Eclipse search capabilities to include desktop resources (https://bugs.eclipse.org/bugs-349351)
Implement search results, with context menus and open action. Implement styled label provider
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/META-INF/MANIFEST.MF4
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/ContentProvider.java20
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchActionGroup.java84
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchLabelProvider.java81
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchResultPage.java85
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchWorkbenchAdapter.java27
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/Messages.java10
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/OpenFileAction.java82
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/SearchResultLabelProvider.java73
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/messages.properties5
-rw-r--r--org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/sandbox/search/ui/SearchResult.java4
11 files changed, 465 insertions, 10 deletions
diff --git a/org.eclipse.mylyn.sandbox.search.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.sandbox.search.ui/META-INF/MANIFEST.MF
index f80b4157..b8e2c60e 100644
--- a/org.eclipse.mylyn.sandbox.search.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.mylyn.sandbox.search.ui/META-INF/MANIFEST.MF
@@ -9,9 +9,11 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.5.0",
org.eclipse.search,
org.eclipse.ui;bundle-version="3.5.0",
org.eclipse.jface.text;bundle-version="3.5.0",
- org.eclipse.core.resources;bundle-version="3.5.0"
+ org.eclipse.core.resources;bundle-version="3.5.0",
+ org.eclipse.ui.ide;bundle-version="3.5.0"
Bundle-ActivationPolicy: lazy
Bundle-Activator: org.eclipse.mylyn.internal.sandbox.search.ui.SearchPlugin
Eclipse-PlatformFilter: (&(osgi.os=win32) (osgi.arch=x86))
Export-Package: org.eclipse.mylyn.internal.sandbox.search.ui;x-internal:=true,
org.eclipse.mylyn.sandbox.search.ui
+Import-Package: org.eclipse.core.filesystem
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/ContentProvider.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/ContentProvider.java
index c955f75a..602b8f15 100644
--- a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/ContentProvider.java
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/ContentProvider.java
@@ -10,8 +10,10 @@
*******************************************************************************/
package org.eclipse.mylyn.internal.sandbox.search.ui;
+import java.util.Arrays;
import java.util.List;
+import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
@@ -49,7 +51,7 @@ class ContentProvider implements ITreeContentProvider, ISearchResultListener {
public Object[] getElements(Object inputElement) {
if (searchResult == inputElement) {
List<SearchResult> items = searchResult.getItems();
- return items.toArray(new Object[items.size()]);
+ return convertToContent(items);
}
return new Object[0];
}
@@ -81,7 +83,7 @@ class ContentProvider implements ITreeContentProvider, ISearchResultListener {
if (!control.isDisposed() && viewer.getInput() == event.getSearchResult()) {
switch (event.getKind()) {
case ADDED:
- viewer.add(searchResult, event.getItems());
+ viewer.add(searchResult, convertToContent(Arrays.asList(event.getItems())));
break;
case CLEARED:
viewer.refresh();
@@ -89,7 +91,21 @@ class ContentProvider implements ITreeContentProvider, ISearchResultListener {
}
}
}
+
});
}
}
+
+ private Object[] convertToContent(List<SearchResult> searchResults) {
+ Object[] converted = new Object[searchResults.size()];
+ for (int x = 0; x < searchResults.size(); ++x) {
+ converted[x] = convertToContent(searchResults.get(x));
+ }
+ return converted;
+ }
+
+ private Object convertToContent(SearchResult result) {
+ IResource resource = result.getResource();
+ return resource == null ? result : resource;
+ }
}
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchActionGroup.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchActionGroup.java
new file mode 100644
index 00000000..82913daf
--- /dev/null
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchActionGroup.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Tasktop Technologies.
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.sandbox.search.ui;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.search.ui.IContextMenuConstants;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.ActionGroup;
+import org.eclipse.ui.actions.OpenWithMenu;
+import org.eclipse.ui.dialogs.PropertyDialogAction;
+
+class DesktopSearchActionGroup extends ActionGroup {
+
+ private final IViewPart viewPart;
+
+ private final PropertyDialogAction propertyDialogAction;
+
+ private final OpenFileAction openFileAction;
+
+ DesktopSearchActionGroup(IViewPart viewPart) {
+ this.viewPart = viewPart;
+
+ propertyDialogAction = new PropertyDialogAction(viewPart.getSite(), viewPart.getSite().getSelectionProvider());
+
+ openFileAction = new OpenFileAction(viewPart.getViewSite().getPage());
+ }
+
+ @Override
+ public void dispose() {
+ propertyDialogAction.dispose();
+ super.dispose();
+ }
+
+ @Override
+ public void fillContextMenu(IMenuManager menu) {
+ super.fillContextMenu(menu);
+ ISelection selection = getContext().getSelection();
+ if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
+ addOpenWithMenu(menu, (IStructuredSelection) selection);
+ if (propertyDialogAction.isEnabled()
+ && propertyDialogAction.isApplicableForSelection((IStructuredSelection) selection)) {
+ menu.appendToGroup(IContextMenuConstants.GROUP_PROPERTIES, propertyDialogAction);
+ }
+ }
+ }
+
+ private void addOpenWithMenu(IMenuManager menu, IStructuredSelection selection) {
+ openFileAction.selectionChanged(selection);
+ if (openFileAction.isEnabled()) {
+ menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, openFileAction);
+ }
+ if (selection.size() == 1) {
+ Object firstElement = selection.getFirstElement();
+ if (firstElement instanceof IAdaptable) {
+ IMenuManager menuManager = new MenuManager(Messages.DesktopSearchActionGroup_MenuOpenWith);
+
+ menuManager.add(new OpenWithMenu(viewPart.getViewSite().getPage(), (IAdaptable) firstElement));
+
+ menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, menuManager);
+ }
+ }
+ }
+
+ @Override
+ public void fillActionBars(IActionBars actionBars) {
+ super.fillActionBars(actionBars);
+ actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(), propertyDialogAction);
+ }
+}
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchLabelProvider.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchLabelProvider.java
new file mode 100644
index 00000000..abe2a79b
--- /dev/null
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchLabelProvider.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Tasktop Technologies.
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.sandbox.search.ui;
+
+import org.eclipse.jface.preference.JFacePreferences;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
+import org.eclipse.jface.viewers.ViewerColumn;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPreferenceConstants;
+import org.eclipse.ui.PlatformUI;
+
+public class DesktopSearchLabelProvider extends DecoratingStyledCellLabelProvider implements IPropertyChangeListener {
+
+ public DesktopSearchLabelProvider(IStyledLabelProvider labelProvider) {
+ super(labelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), null);
+ }
+
+ @Override
+ public void initialize(ColumnViewer viewer, ViewerColumn column) {
+ registerListeners();
+ setOwnerDrawEnabled(coloredLabels());
+ super.initialize(viewer, column);
+ }
+
+ private void registerListeners() {
+ PlatformUI.getPreferenceStore().addPropertyChangeListener(this);
+ JFaceResources.getColorRegistry().addListener(this);
+ }
+
+ private void deregisterListeners() {
+ JFaceResources.getColorRegistry().removeListener(this);
+ PlatformUI.getPreferenceStore().removePropertyChangeListener(this);
+ }
+
+ @Override
+ public void dispose() {
+ deregisterListeners();
+ super.dispose();
+ }
+
+ private boolean coloredLabels() {
+ return PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS);
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ final String property = event.getProperty();
+ if (property.equals(JFacePreferences.QUALIFIER_COLOR) || property.equals(JFacePreferences.DECORATIONS_COLOR)
+ || property.equals(IWorkbenchPreferenceConstants.USE_COLORED_LABELS)) {
+ if (getViewer() == null || getViewer().getControl().isDisposed()) {
+ return;
+ }
+ Display display = getViewer().getControl().getDisplay();
+ display.asyncExec(new Runnable() {
+ public void run() {
+ refresh();
+ }
+ });
+ }
+ }
+
+ protected void refresh() {
+ ColumnViewer viewer = getViewer();
+ if (viewer != null && !viewer.getControl().isDisposed()) {
+ setOwnerDrawEnabled(coloredLabels());
+ viewer.refresh();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchResultPage.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchResultPage.java
index af86a493..3d34ce49 100644
--- a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchResultPage.java
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchResultPage.java
@@ -10,8 +10,17 @@
*******************************************************************************/
package org.eclipse.mylyn.internal.sandbox.search.ui;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.search.ui.IContextMenuConstants;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.ISearchResultListener;
import org.eclipse.search.ui.ISearchResultPage;
@@ -22,7 +31,8 @@ import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IMemento;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.part.Page;
/**
@@ -42,6 +52,10 @@ public class DesktopSearchResultPage extends Page implements ISearchResultPage {
private ISearchResultListener listener;
+ private MenuManager menu;
+
+ private DesktopSearchActionGroup actionGroup;
+
public Object getUIState() {
return viewer == null ? null : viewer.getSelection();
}
@@ -85,6 +99,7 @@ public class DesktopSearchResultPage extends Page implements ISearchResultPage {
public void setViewPart(ISearchResultViewPart part) {
this.viewPart = part;
+ actionGroup = new DesktopSearchActionGroup(part);
}
public ISearchResultViewPart getViewPart() {
@@ -105,9 +120,10 @@ public class DesktopSearchResultPage extends Page implements ISearchResultPage {
container.setLayout(new FillLayout());
viewer = new TreeViewer(container, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setUseHashlookup(true);
viewer.setContentProvider(new ContentProvider());
- viewer.setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider());
+ viewer.setLabelProvider(new DesktopSearchLabelProvider(new SearchResultLabelProvider()));
getSite().setSelectionProvider(viewer);
@@ -115,15 +131,80 @@ public class DesktopSearchResultPage extends Page implements ISearchResultPage {
control = container;
+ createMenu();
+
+ viewer.getControl().setMenu(menu.createContextMenu(viewer.getControl()));
+ getSite().registerContextMenu(getViewPart().getViewSite().getId(), menu, viewer);
+
+ viewer.addOpenListener(new IOpenListener() {
+
+ public void open(OpenEvent event) {
+ ISelection selection = event.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ OpenFileAction openFileAction = new OpenFileAction(getSite().getPage());
+ openFileAction.selectionChanged(structuredSelection);
+ if (openFileAction.isEnabled()) {
+ openFileAction.run();
+ }
+ }
+ }
+ });
+
getViewPart().updateLabel();
}
+ private void createMenu() {
+ menu = new MenuManager("#PopUp"); //$NON-NLS-1$
+ menu.setRemoveAllWhenShown(true);
+ menu.setParent(getSite().getActionBars().getMenuManager());
+ menu.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ fillContextMenu(manager);
+ }
+ });
+ }
+
+ protected void fillContextMenu(IMenuManager menu) {
+ createContextMenuGroups(menu);
+
+ actionGroup.setContext(new ActionContext(getSite().getSelectionProvider().getSelection()));
+ actionGroup.fillContextMenu(menu);
+
+ getViewPart().fillContextMenu(menu);
+ }
+
+ private void createContextMenuGroups(IMenuManager menu) {
+ menu.add(new Separator(IContextMenuConstants.GROUP_NEW));
+ menu.add(new GroupMarker(IContextMenuConstants.GROUP_GOTO));
+ menu.add(new GroupMarker(IContextMenuConstants.GROUP_OPEN));
+ menu.add(new Separator(IContextMenuConstants.GROUP_SHOW));
+ menu.add(new Separator(IContextMenuConstants.GROUP_EDIT));
+ menu.add(new GroupMarker(IContextMenuConstants.GROUP_REMOVE_MATCHES));
+ menu.add(new Separator(IContextMenuConstants.GROUP_REORGANIZE));
+ menu.add(new GroupMarker(IContextMenuConstants.GROUP_GENERATE));
+ menu.add(new Separator(IContextMenuConstants.GROUP_SEARCH));
+ menu.add(new Separator(IContextMenuConstants.GROUP_BUILD));
+ menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ menu.add(new Separator(IContextMenuConstants.GROUP_VIEWER_SETUP));
+ menu.add(new Separator(IContextMenuConstants.GROUP_PROPERTIES));
+ }
+
@Override
public Control getControl() {
return control;
}
@Override
+ public void dispose() {
+ if (actionGroup != null) {
+ actionGroup.dispose();
+ actionGroup = null;
+ }
+ super.dispose();
+ }
+
+ @Override
public void setFocus() {
getControl().setFocus();
}
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchWorkbenchAdapter.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchWorkbenchAdapter.java
index 692489f7..2e3f59d6 100644
--- a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchWorkbenchAdapter.java
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/DesktopSearchWorkbenchAdapter.java
@@ -10,8 +10,14 @@
*******************************************************************************/
package org.eclipse.mylyn.internal.sandbox.search.ui;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.mylyn.sandbox.search.ui.SearchResult;
+import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.model.IWorkbenchAdapter;
@@ -27,9 +33,24 @@ public class DesktopSearchWorkbenchAdapter implements IWorkbenchAdapter {
if (o instanceof SearchResult) {
SearchResult item = (SearchResult) o;
- ImageDescriptor image = PlatformUI.getWorkbench()
- .getEditorRegistry()
- .getImageDescriptor(item.getFile().getName(), null);
+ IResource resource = item.getResource();
+
+ final IEditorRegistry editorRegistry = PlatformUI.getWorkbench().getEditorRegistry();
+
+ IContentType contentType = null;
+ if (resource instanceof IFile) {
+ IFile file = (IFile) resource;
+ try {
+ final IContentDescription contentDescription = file.getContentDescription();
+ if (contentDescription != null) {
+ contentType = contentDescription.getContentType();
+ }
+ } catch (CoreException e) {
+ // ignore
+ }
+ }
+
+ ImageDescriptor image = editorRegistry.getImageDescriptor(item.getFile().getName(), contentType);
if (image == null) {
image = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE);
}
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/Messages.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/Messages.java
index a1cd1443..be296d3d 100644
--- a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/Messages.java
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/Messages.java
@@ -17,6 +17,8 @@ class Messages extends NLS {
public static String CompositeSearchProvider_SearchingTask;
+ public static String DesktopSearchActionGroup_MenuOpenWith;
+
public static String DesktopSearchPage_CaseSensitive;
public static String DesktopSearchPage_FilenamePatterns;
@@ -41,8 +43,16 @@ class Messages extends NLS {
public static String DesktopSearchResultPage_EmptyLabel;
+ public static String OpenFileAction_CannotOpenFile;
+
+ public static String OpenFileAction_OpenFileErrorMessage;
+
+ public static String OpenFileAction_OpenFileErrorTitle;
+
public static String SearchProviders_NoSearchProvidersAvailable;
+ public static String SearchResultLabelProvider_QualifierFormat;
+
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/OpenFileAction.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/OpenFileAction.java
new file mode 100644
index 00000000..c810d49b
--- /dev/null
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/OpenFileAction.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Tasktop Technologies.
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.sandbox.search.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.sandbox.search.ui.SearchResult;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.ide.IDE;
+
+class OpenFileAction extends org.eclipse.ui.actions.OpenFileAction {
+
+ private final IWorkbenchPage page;
+
+ public OpenFileAction(IWorkbenchPage page) {
+ super(page);
+ this.page = page;
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ return !selection.isEmpty();
+ }
+
+ @Override
+ public void run() {
+ super.run();
+
+ List<SearchResult> unopenable = new ArrayList<SearchResult>();
+
+ List selectedNonResources = getSelectedNonResources();
+ for (Object object : selectedNonResources) {
+ if (object instanceof SearchResult) {
+ SearchResult result = (SearchResult) object;
+
+ IFileStore store = EFS.getLocalFileSystem().getStore(new Path(result.getFile().getParent()));
+ final IFileStore fileStore = store.getChild(result.getFile().getName());
+ IFileInfo info = fileStore.fetchInfo();
+ if (!info.isDirectory() && info.exists()) {
+ try {
+ IDE.openEditorOnFileStore(page, fileStore);
+ } catch (PartInitException e) {
+ String message = NLS.bind(Messages.OpenFileAction_CannotOpenFile, new String[] {
+ result.getFile().getName(), e.getMessage() });
+ SearchPlugin.getDefault()
+ .getLog()
+ .log(new Status(IStatus.ERROR, SearchPlugin.BUNDLE_ID, message, e));
+ MessageDialog.openError(page.getWorkbenchWindow().getShell(),
+ Messages.OpenFileAction_OpenFileErrorTitle, message);
+ }
+ } else {
+ unopenable.add(result);
+ }
+ }
+ }
+ if (!unopenable.isEmpty()) {
+ MessageDialog.openError(page.getWorkbenchWindow().getShell(), Messages.OpenFileAction_OpenFileErrorTitle,
+ NLS.bind(Messages.OpenFileAction_OpenFileErrorMessage, unopenable.size()));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/SearchResultLabelProvider.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/SearchResultLabelProvider.java
new file mode 100644
index 00000000..3337f04e
--- /dev/null
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/SearchResultLabelProvider.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Tasktop Technologies.
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.sandbox.search.ui;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.mylyn.sandbox.search.ui.SearchResult;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+public class SearchResultLabelProvider extends LabelProvider implements IStyledLabelProvider {
+
+ private WorkbenchLabelProvider labelProvider = new WorkbenchLabelProvider();
+
+ @Override
+ public Image getImage(Object element) {
+ return labelProvider.getImage(element);
+ }
+
+ @Override
+ public String getText(Object element) {
+ return getStyledText(element).toString();
+ }
+
+ @Override
+ public void dispose() {
+ labelProvider.dispose();
+ labelProvider = null;
+ super.dispose();
+ }
+
+ public StyledString getStyledText(Object element) {
+ String name = null;
+ String qualifier = null;
+ if (element instanceof SearchResult) {
+ SearchResult result = (SearchResult) element;
+ name = result.getFile().getName();
+ IResource resource = result.getResource();
+ if (resource != null) {
+ element = resource;
+ }
+ qualifier = result.getFile().getParentFile().getPath();
+ }
+ if (element instanceof IResource) {
+ IResource resource = (IResource) element;
+ name = resource.getName();
+ qualifier = resource.getParent().getFullPath().toString();
+ }
+ if (name != null) {
+ StyledString string = new StyledString(name);
+ String decorated = NLS.bind(Messages.SearchResultLabelProvider_QualifierFormat,
+ new String[] { string.toString(), qualifier });
+
+ StyledCellLabelProvider.styleDecoratedString(decorated, StyledString.QUALIFIER_STYLER, string);
+ return string;
+ }
+ return new StyledString(labelProvider.getText(element));
+ }
+
+}
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/messages.properties b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/messages.properties
index 423fa3bd..c6ce90f6 100644
--- a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/messages.properties
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/internal/sandbox/search/ui/messages.properties
@@ -9,6 +9,7 @@
# Tasktop Technologies - initial API and implementation
###############################################################################
CompositeSearchProvider_SearchingTask=Searching for files matching "{0}"
+DesktopSearchActionGroup_MenuOpenWith=Open With
DesktopSearchPage_FilenamePatterns=File name patterns:
DesktopSearchPage_SearchFailedMessage=Cannot perform search: {0}
DesktopSearchPage_SearchFailedTitle=Search Failed
@@ -21,4 +22,8 @@ DesktopSearchQuery_NFilesMatching={1} files matching "{0}"
DesktopSearchQuery_NoFilesMatching=No files matching "{0}"
DesktopSearchQuery_OneFileMatches=1 file matches "{0}"
DesktopSearchResultPage_EmptyLabel=
+OpenFileAction_CannotOpenFile=Cannot open file {0}: {1}
+OpenFileAction_OpenFileErrorMessage={0} files could not be opened
+OpenFileAction_OpenFileErrorTitle=Cannot Open Files
SearchProviders_NoSearchProvidersAvailable=Cannot perform search: no search providers available
+SearchResultLabelProvider_QualifierFormat={0} - {1}
diff --git a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/sandbox/search/ui/SearchResult.java b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/sandbox/search/ui/SearchResult.java
index 759f455e..59b0e584 100644
--- a/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/sandbox/search/ui/SearchResult.java
+++ b/org.eclipse.mylyn.sandbox.search.ui/src/org/eclipse/mylyn/sandbox/search/ui/SearchResult.java
@@ -43,9 +43,9 @@ public class SearchResult extends PlatformObject {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
if (file.isFile()) {
- resource = workspace.getRoot().getFileForLocation(new Path(file.getName()));
+ resource = workspace.getRoot().getFileForLocation(new Path(file.getAbsolutePath()));
} else if (file.isDirectory()) {
- resource = workspace.getRoot().getContainerForLocation(new Path(file.getName()));
+ resource = workspace.getRoot().getContainerForLocation(new Path(file.getAbsolutePath()));
}
return resource;

Back to the top