Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java')
-rw-r--r--org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java431
1 files changed, 431 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java b/org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java
new file mode 100644
index 000000000..cb7487522
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java
@@ -0,0 +1,431 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 Tasktop Technologies 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.search;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.internal.provisional.commons.ui.EnhancedFilteredTree;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SubstringPatternFilter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.actions.OpenTaskSearchAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.OpenWithBrowserAction;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTreeContentProvider.GroupBy;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskDragSourceListener;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.search.ui.IContextMenuConstants;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.part.IShowInTargetList;
+
+/**
+ * Displays the results of a Repository search.
+ *
+ * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage
+ * @author Rob Elves
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class RepositorySearchResultView extends AbstractTextSearchViewPage implements IAdaptable {
+
+ private class GroupingAction extends Action {
+
+ private final GroupBy groupBy;
+
+ public GroupingAction(String text, GroupBy groupBy) {
+ super(text, IAction.AS_CHECK_BOX);
+ this.groupBy = groupBy;
+ groupingActions.add(this);
+ }
+
+ @Override
+ public void run() {
+ for (GroupingAction action : groupingActions) {
+ action.setChecked(false);
+ }
+
+ SearchResultTreeContentProvider contentProvider = (SearchResultTreeContentProvider) getViewer().getContentProvider();
+ if (contentProvider.getSelectedGroup() == groupBy) {
+ contentProvider.setSelectedGroup(GroupBy.NONE);
+ } else {
+ contentProvider.setSelectedGroup(groupBy);
+ setChecked(true);
+ }
+ getViewer().refresh();
+ }
+ }
+
+ private class FilteringAction extends Action {
+
+ private final ViewerFilter filter;
+
+ public FilteringAction(String text, ViewerFilter filter) {
+ super(text, IAction.AS_CHECK_BOX);
+ this.filter = filter;
+ filterActions.add(this);
+ }
+
+ @Override
+ public void runWithEvent(Event event) {
+ if (isChecked()) {
+ getViewer().addFilter(filter);
+ } else {
+ getViewer().removeFilter(filter);
+ }
+ }
+ }
+
+ private static final String MEMENTO_KEY_SORT = "sort"; //$NON-NLS-1$
+
+ private SearchResultContentProvider searchResultProvider;
+
+ private final OpenSearchResultAction openInEditorAction;
+
+ private final CreateQueryFromSearchAction createQueryAction;
+
+ private final Action refineSearchAction;
+
+ private static final String[] SHOW_IN_TARGETS = new String[] { ITasksUiConstants.ID_VIEW_TASKS };
+
+ private TaskListToolTip toolTip;
+
+ private final List<GroupingAction> groupingActions;
+
+ private final List<FilteringAction> filterActions;
+
+ private final OpenWithBrowserAction openSearchWithBrowserAction;
+
+ private final SearchResultSorter searchResultSorter;
+
+ private SearchResultSortAction sortByDialogAction;
+
+ private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() {
+ public String[] getShowInTargetIds() {
+ return SHOW_IN_TARGETS;
+ }
+ };
+
+ public RepositorySearchResultView() {
+ // Only use the table layout.
+ super(FLAG_LAYOUT_TREE);
+
+ openInEditorAction = new OpenSearchResultAction(Messages.RepositorySearchResultView_Open_in_Editor, this);
+ createQueryAction = new CreateQueryFromSearchAction(
+ Messages.RepositorySearchResultView_Create_Query_from_Search_, this);
+ refineSearchAction = new OpenTaskSearchAction();
+ refineSearchAction.setText(Messages.RepositorySearchResultView_Refine_Search_);
+ openSearchWithBrowserAction = new OpenWithBrowserAction();
+ openSearchWithBrowserAction.setText(Messages.RepositorySearchResultView_Open_Search_with_Browser_Label);
+
+ groupingActions = new ArrayList<GroupingAction>();
+ new GroupingAction(Messages.RepositorySearchResultView_Group_By_Owner, GroupBy.OWNER);
+// new GroupingAction(Messages.RepositorySearchResultView_Group_By_Complete, GroupBy.COMPLETION);
+
+ filterActions = new ArrayList<FilteringAction>();
+ new FilteringAction(Messages.RepositorySearchResultView_Filter_Completed_Tasks, new ViewerFilter() {
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (element instanceof ITask) {
+ return !((ITask) element).isCompleted();
+ } else if (element instanceof TaskGroup) {
+ TaskGroup taskGroup = (TaskGroup) element;
+ return taskGroup.getHandleIdentifier().equals("group-incompleteIncomplete"); //$NON-NLS-1$
+ }
+ return true;
+ }
+ });
+
+ // construct early since to be ready when restoreState() is invoked
+ searchResultSorter = new SearchResultSorter();
+ }
+
+ @Override
+ protected void elementsChanged(Object[] objects) {
+ if (searchResultProvider != null) {
+ searchResultProvider.elementsChanged(objects);
+ getViewer().refresh();
+ }
+ }
+
+ @Override
+ protected void clear() {
+ if (searchResultProvider != null) {
+ searchResultProvider.clear();
+ getViewer().refresh();
+ }
+ }
+
+ // Allows the inherited method "getViewer" to be accessed publicly.
+ @Override
+ public StructuredViewer getViewer() {
+ return super.getViewer();
+ }
+
+ @Override
+ protected void configureTreeViewer(TreeViewer viewer) {
+ viewer.setUseHashlookup(true);
+ searchResultProvider = new SearchResultTreeContentProvider();
+ viewer.setContentProvider(searchResultProvider);
+
+ DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(new SearchResultsLabelProvider(
+ searchResultProvider, viewer), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator());
+ viewer.setLabelProvider(labelProvider);
+ viewer.setSorter(searchResultSorter);
+
+ Transfer[] dragTypes = new Transfer[] { LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance() };
+
+ getViewer().addDragSupport(DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK, dragTypes,
+ new TaskDragSourceListener(getViewer()));
+
+ sortByDialogAction = new SearchResultSortAction(this);
+
+ toolTip = new TaskListToolTip(viewer.getControl());
+ }
+
+ @Override
+ protected TreeViewer createTreeViewer(Composite parent) {
+ // create a filtered tree
+ Composite treeComposite = parent;
+ Layout parentLayout = parent.getLayout();
+ if (!(parentLayout instanceof GridLayout)) {
+ treeComposite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ treeComposite.setLayout(layout);
+ }
+
+ FilteredTree searchTree = new EnhancedFilteredTree(treeComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL,
+ new SubstringPatternFilter(), true);
+ return searchTree.getViewer();
+ }
+
+ @Override
+ protected void configureTableViewer(TableViewer viewer) {
+// viewer.setUseHashlookup(true);
+// String[] columnNames = new String[] { "Summary" };
+// TableColumn[] columns = new TableColumn[columnNames.length];
+// int[] columnWidths = new int[] { 500 };
+// viewer.setColumnProperties(columnNames);
+//
+// viewer.getTable().setHeaderVisible(false);
+// for (int i = 0; i < columnNames.length; i++) {
+// columns[i] = new TableColumn(viewer.getTable(), 0, i); // SWT.LEFT
+// columns[i].setText(columnNames[i]);
+// columns[i].setWidth(columnWidths[i]);
+// columns[i].setData(new Integer(i));
+// columns[i].addSelectionListener(new SelectionAdapter() {
+//
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// TableColumn col = (TableColumn) e.getSource();
+// Integer integer = (Integer) col.getData();
+// setSortOrder(integer.intValue());
+// }
+// });
+// }
+//
+// IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+// Color categoryBackground = themeManager.getCurrentTheme().getColorRegistry().get(
+// TaskListColorsAndFonts.THEME_COLOR_TASKLIST_CATEGORY);
+//
+// SearchViewTableLabelProvider taskListTableLabelProvider = new SearchViewTableLabelProvider(
+// new TaskElementLabelProvider(true),
+// PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), categoryBackground);
+//
+// viewer.setLabelProvider(taskListTableLabelProvider);
+// viewer.setContentProvider(new SearchResultTableContentProvider(this));
+//
+// // Set the order when the search view is loading so that the items are
+// // sorted right away
+// setSortOrder(currentSortOrder);
+//
+// taskContentProvider = (SearchResultContentProvider) viewer.getContentProvider();
+ }
+
+ @Override
+ public void dispose() {
+ toolTip.dispose();
+ super.dispose();
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Object getAdapter(Class adapter) {
+ return getAdapterDelegate(adapter);
+ }
+
+ private Object getAdapterDelegate(Class<?> adapter) {
+ if (IShowInTargetList.class.equals(adapter)) {
+ return SHOW_IN_TARGET_LIST;
+ }
+ return null;
+ }
+
+ @Override
+ protected void showMatch(Match match, int currentOffset, int currentLength, boolean activate)
+ throws PartInitException {
+ AbstractTask repositoryHit = (AbstractTask) match.getElement();
+ TasksUiInternal.refreshAndOpenTaskListElement(repositoryHit);
+ }
+
+ @Override
+ protected void fillContextMenu(IMenuManager menuManager) {
+ super.fillContextMenu(menuManager);
+
+ // open actions
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_OPEN, openInEditorAction);
+
+ // Add to Task List menu
+ // HACK: this should be a contribution
+ final MenuManager subMenuManager = new MenuManager(MessageFormat.format(
+ Messages.RepositorySearchResultView_Add_to_X_Category, TaskListView.LABEL_VIEW));
+ List<AbstractTaskCategory> categories = new ArrayList<AbstractTaskCategory>(TasksUiInternal.getTaskList()
+ .getCategories());
+ Collections.sort(categories);
+ for (final AbstractTaskCategory category : categories) {
+ if (!(category instanceof UnmatchedTaskContainer)) {//.equals(TasksUiPlugin.getTaskList().getArchiveContainer())) {
+ Action action = new Action() {
+ @Override
+ public void run() {
+ moveToCategory(category);
+ }
+ };
+ String text = category.getSummary();
+ action.setText(text);
+ action.setImageDescriptor(TasksUiImages.CATEGORY);
+ subMenuManager.add(action);
+ }
+ }
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_OPEN, subMenuManager);
+
+ // search actions
+
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, createQueryAction);
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, refineSearchAction);
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, openSearchWithBrowserAction);
+
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, sortByDialogAction);
+ for (Action action : groupingActions) {
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
+ }
+ for (Action action : filterActions) {
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
+ }
+
+ }
+
+ private void moveToCategory(AbstractTaskCategory category) {
+ StructuredSelection selection = (StructuredSelection) this.getViewer().getSelection();
+ for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) {
+ Object selectedObject = iterator.next();
+ if (selectedObject instanceof ITask) {
+ ITask task = (ITask) selectedObject;
+ TasksUiInternal.getTaskList().addTask(task, category);
+ }
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+ IMenuManager menuManager = getSite().getActionBars().getMenuManager();
+ for (Action action : groupingActions) {
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
+ }
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, new Separator());
+ for (Action action : filterActions) {
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
+ }
+ }
+
+ @Override
+ public void setInput(ISearchResult newSearch, Object viewState) {
+ super.setInput(newSearch, viewState);
+ if (newSearch != null) {
+ ISearchQuery query = ((RepositorySearchResult) newSearch).getQuery();
+ IRepositoryQuery repositoryQuery = ((SearchHitCollector) query).getRepositoryQuery();
+ openSearchWithBrowserAction.selectionChanged(new StructuredSelection(repositoryQuery));
+ } else {
+ openSearchWithBrowserAction.selectionChanged(StructuredSelection.EMPTY);
+ }
+ }
+
+ public SearchResultSorter getSorter() {
+ return searchResultSorter;
+ }
+
+ @Override
+ public void restoreState(IMemento memento) {
+ super.restoreState(memento);
+ if (memento != null) {
+ IMemento child = memento.getChild(MEMENTO_KEY_SORT);
+ if (child != null && searchResultSorter != null) {
+ searchResultSorter.getTaskComparator().restoreState(child);
+ }
+ }
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+ if (memento != null) {
+ IMemento child = memento.createChild(MEMENTO_KEY_SORT);
+ if (searchResultSorter != null) {
+ searchResultSorter.getTaskComparator().saveState(child);
+ }
+ }
+ }
+
+}

Back to the top