diff options
author | mkersten | 2007-08-27 21:56:55 +0000 |
---|---|---|
committer | mkersten | 2007-08-27 21:56:55 +0000 |
commit | 3a9223611fd99f9db822a5dca33929a00f9511d2 (patch) | |
tree | 3f99c878110b957ed1a71a8223c2ed7e1d3adfd6 | |
parent | c439da2f06e4326e0d56902acf7f688d883a36d0 (diff) | |
download | org.eclipse.mylyn.tasks-3a9223611fd99f9db822a5dca33929a00f9511d2.tar.gz org.eclipse.mylyn.tasks-3a9223611fd99f9db822a5dca33929a00f9511d2.tar.xz org.eclipse.mylyn.tasks-3a9223611fd99f9db822a5dca33929a00f9511d2.zip |
REOPENED - bug 193423: merge Open Repository Task dialog and Search functionality
https://bugs.eclipse.org/bugs/show_bug.cgi?id=193423
-rw-r--r-- | org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java (renamed from org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskGroup.java) | 5 | ||||
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/plugin.xml | 22 | ||||
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java | 167 | ||||
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SearchForRepositoryTask.java | 43 | ||||
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java | 28 | ||||
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractFilteredTree.java | 21 | ||||
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java | 20 | ||||
-rw-r--r-- | org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java | 48 |
8 files changed, 315 insertions, 39 deletions
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskGroup.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java index e012eafc5..318d16bcf 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskGroup.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java @@ -5,10 +5,13 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.mylyn.tasks.core; +package org.eclipse.mylyn.internal.tasks.core; import java.util.Set; +import org.eclipse.mylyn.tasks.core.AbstractTask; +import org.eclipse.mylyn.tasks.core.AbstractTaskCategory; + /** * @author Eugene Kuleshov * @since 2.1 diff --git a/org.eclipse.mylyn.tasks.ui/plugin.xml b/org.eclipse.mylyn.tasks.ui/plugin.xml index ce69ef375..039985de3 100644 --- a/org.eclipse.mylyn.tasks.ui/plugin.xml +++ b/org.eclipse.mylyn.tasks.ui/plugin.xml @@ -676,6 +676,14 @@ style="push" toolbarPath="org.eclipse.search.searchActionSet/Search" tooltip="Open Task"/> + <action + class="org.eclipse.mylyn.internal.tasks.ui.actions.SearchForRepositoryTask" + definitionId="org.eclipse.mylyn.tasks.ui.command.searchForTask" + icon="icons/etool16/open-repository-task.gif" + id="org.eclipse.mylyn.tasks.ui.open.task.remote" + label="Search for Repository Task..." + style="push" + tooltip="Search for Repository Task"/> </actionSet> </extension> @@ -741,8 +749,8 @@ id="org.eclipse.mylyn.tasks.ui.open.task.remote" label="Open &Repository Task..." menubarPath="navigate/open.ext3" - style="push" - tooltip="Open Repository Task"/> + style="push" + tooltip="Open Repository Task"/> </actionSet> </extension> @@ -754,6 +762,10 @@ name="Open Task"/> <command categoryId="org.eclipse.ui.category.navigate" + id="org.eclipse.mylyn.tasks.ui.command.searchForTask" + name="Search Repository for Task"/> + <command + categoryId="org.eclipse.ui.category.navigate" id="org.eclipse.mylyn.tasks.ui.command.openRemoteTask" name="Open Remote Task"/> <command @@ -772,10 +784,14 @@ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="M1+F12"/> <key - commandId="org.eclipse.mylyn.tasks.ui.command.openRemoteTask" + commandId="org.eclipse.mylyn.tasks.ui.command.searchForTask" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="M1+M2+F12"/> <key + commandId="org.eclipse.mylyn.tasks.ui.command.openRemoteTask" + schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="M1+M2+M3+F12"/> + <key commandId="org.eclipse.mylyn.tasks.ui.command.activateTask" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="M1+F9"/> diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java index 877f60e82..fa3536761 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java @@ -16,18 +16,25 @@ import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTask; +import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView; import org.eclipse.mylyn.monitor.core.StatusHandler; import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; +import org.eclipse.mylyn.tasks.core.AbstractTask; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.tasks.ui.TasksUiUtil; +import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; +import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput; import org.eclipse.mylyn.tasks.ui.search.AbstractRepositoryQueryPage; import org.eclipse.search.ui.ISearchPage; import org.eclipse.search.ui.ISearchPageContainer; import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; @@ -37,9 +44,11 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; -import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.forms.widgets.ImageHyperlink; @@ -61,6 +70,8 @@ public class TaskSearchPage extends DialogPage implements ISearchPage { private Combo repositoryCombo; + private Text keyText; + private TaskRepository repository; private Composite fParentComposite; @@ -77,8 +88,19 @@ public class TaskSearchPage extends DialogPage implements ISearchPage { public boolean performAction() { saveDialogSettings(); - ISearchPage page = (ISearchPage) queryPages[currentPageIndex].getData(PAGE_KEY); - return page.performAction(); + String key = keyText.getText(); + if (key != null && key.trim().length() > 0) { + boolean openSuccessful = TasksUiUtil.openRepositoryTask(repository, key); + if (!openSuccessful) { + MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), + ITasksUiConstants.TITLE_DIALOG, "No task found matching key: " + key); +// new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open(); + } + return openSuccessful; + } else { + ISearchPage page = (ISearchPage) queryPages[currentPageIndex].getData(PAGE_KEY); + return page.performAction(); + } } public void setContainer(ISearchPageContainer container) { @@ -111,12 +133,9 @@ public class TaskSearchPage extends DialogPage implements ISearchPage { private void createRepositoryGroup(Composite control) { Composite group = new Composite(control, SWT.NONE); -// group.setText("Repository"); - GridLayout layout = new GridLayout(); - layout.numColumns = 4; + GridLayout layout = new GridLayout(6, false); group.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = 1; group.setLayoutData(gd); Label label = new Label(group, SWT.NONE); @@ -129,33 +148,65 @@ public class TaskSearchPage extends DialogPage implements ISearchPage { displayQueryPage(repositoryCombo.getSelectionIndex()); } }); - repositoryCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); - +// repositoryCombo.setLayoutData(new GridData(GridData)); label = new Label(group, SWT.NONE); label.setText(" "); - ImageHyperlink openHyperlink = new ImageHyperlink(group, SWT.NONE); - openHyperlink.setText("Open Repository Task by Key/ID..."); - openHyperlink.setForeground(TaskListColorsAndFonts.COLOR_HYPERLINK_WIDGET); - openHyperlink.setUnderlined(true); - openHyperlink.addHyperlinkListener(new IHyperlinkListener() { - - public void linkActivated(HyperlinkEvent e) { - getShell().close(); - new OpenRepositoryTask().run(null); + Label labelKey = new Label(group, SWT.NONE); + labelKey.setText("Task Key/ID: "); + keyText = new Text(group, SWT.BORDER); + keyText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); + + String findText = null; + TaskListView taskListView = TaskListView.getFromActivePerspective(); + if (taskListView != null) { + findText = taskListView.getFilteredTree().getFilterControl().getText(); + if (findText != null && findText.trim().length() > 0 && isTaskKeyCandidate(findText)) { + keyText.setText(findText); + keyText.setFocus(); } + } + + keyText.addKeyListener(new KeyListener() { - public void linkEntered(HyperlinkEvent e) { + public void keyPressed(KeyEvent e) { // ignore } - public void linkExited(HyperlinkEvent e) { - // ignore + public void keyReleased(KeyEvent e) { + updatePageEnablement(); } + }); + + ImageHyperlink clearKey = new ImageHyperlink(group, SWT.NONE); + clearKey.setImage(TasksUiImages.getImage(TasksUiImages.REMOVE)); + clearKey.addHyperlinkListener(new HyperlinkAdapter() { + @Override + public void linkActivated(HyperlinkEvent e) { + keyText.setText(""); + updatePageEnablement(); + } }); -// openHyperlink.set -// openHyperlink.setImage(TasksUiImages.getImage(TasksUiImages.QUERY)); + } + + private void updatePageEnablement() { + if (keyText.getText() != null && keyText.getText().trim().length() > 0) { + setControlsEnabled(queryPages[currentPageIndex], false); + } else { + setControlsEnabled(queryPages[currentPageIndex], true); + } + } + + // TODO: make reusable or find better API, task editor has similar functionality + private void setControlsEnabled(Control control, boolean enabled) { + control.setEnabled(enabled); + if (control instanceof Composite) { + for (Control childControl : ((Composite) control).getChildren()) { + childControl.setEnabled(enabled); + setControlsEnabled(childControl, enabled); + } + } } private Control createPage(TaskRepository repository, ISearchPage searchPage) { @@ -230,6 +281,7 @@ public class TaskSearchPage extends DialogPage implements ISearchPage { currentPageIndex = pageIndex; fParentComposite.getParent().layout(true, true); + updatePageEnablement(); } @Override @@ -276,8 +328,7 @@ public class TaskSearchPage extends DialogPage implements ISearchPage { repositoryCombo.select(indexToSelect); } - // TODO: Create one page per connector and repopulate based - // on repository + // TODO: Create one page per connector and repopulate based on repository queryPages = new Control[repositoryUrls.length]; displayQueryPage(repositoryCombo.getSelectionIndex()); // updateAttributesFromRepository(repositoryCombo.getText(), @@ -292,6 +343,70 @@ public class TaskSearchPage extends DialogPage implements ISearchPage { } super.setVisible(visible); + + setDefaultValuesAndFocus(); + } + + private void setDefaultValuesAndFocus() { + // TODO: generalize selection resolution + IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); + AbstractTask selectedTask = null; + if (editor instanceof TaskEditor) { + selectedTask = ((TaskEditorInput)((TaskEditor)editor).getEditorInput()).getTask(); + } + if (selectedTask == null) { + TaskListView taskListView = TaskListView.getFromActivePerspective(); + if (taskListView != null) { + selectedTask = taskListView.getSelectedTask(); + } + } + + if (selectedTask != null) { + TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(selectedTask.getRepositoryUrl()); + if (repository != null) { + int index = 0; + for (String repositoryUrl : repositoryCombo.getItems()) { + if (repositoryUrl.equals(repository.getUrl())) { + repositoryCombo.select(index); + } + index++; + } + } + } + + if (keyText.getText() != null && keyText.getText().trim().length() > 0) { + keyText.setFocus(); + keyText.setSelection(0, keyText.getText().length()); + } else { + Clipboard clipboard = new Clipboard(Display.getDefault()); + TextTransfer transfer = TextTransfer.getInstance(); + String contents = (String) clipboard.getContents(transfer); + if (contents != null) { + if (isTaskKeyCandidate(contents)) { + keyText.setText(contents); + keyText.setFocus(); + keyText.setSelection(0, keyText.getText().length()); + } + } +// repositoryCombo.setFocus(); + } + } + + private boolean isTaskKeyCandidate(String contents) { + boolean looksLikeKey = false; + try { + Integer.parseInt(contents); + looksLikeKey = true; + } catch (NumberFormatException nfe) { + } + if (!looksLikeKey) { + try { + Integer.parseInt(contents.substring(contents.lastIndexOf('-'))); + looksLikeKey = true; + } catch (Exception e) { + } + } + return looksLikeKey; } public IDialogSettings getDialogSettings() { diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SearchForRepositoryTask.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SearchForRepositoryTask.java new file mode 100644 index 000000000..3af2e2fa7 --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SearchForRepositoryTask.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Mylyn project committers 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 + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.ui.actions; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage; +import org.eclipse.search.internal.ui.SearchDialog; +import org.eclipse.ui.IViewActionDelegate; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; +import org.eclipse.ui.PlatformUI; + +/** + * @author Mik Kersten + */ +public class SearchForRepositoryTask extends Action implements IWorkbenchWindowActionDelegate, IViewActionDelegate { + + public void run(IAction action) { + new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open(); + } + + public void dispose() { + } + + public void init(IWorkbenchWindow window) { + } + + public void selectionChanged(IAction action, ISelection selection) { + } + + public void init(IViewPart view) { + } + +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java index 70255ec5e..f56f230ae 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java @@ -27,12 +27,16 @@ import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts; +import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage; import org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider; +import org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree; import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; import org.eclipse.mylyn.tasks.core.AbstractTask; import org.eclipse.mylyn.tasks.core.AbstractTaskContainer; import org.eclipse.mylyn.tasks.core.TaskList; import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; +import org.eclipse.search.internal.ui.SearchDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; @@ -48,6 +52,9 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.SelectionStatusDialog; +import org.eclipse.ui.forms.events.HyperlinkEvent; +import org.eclipse.ui.forms.events.IHyperlinkListener; +import org.eclipse.ui.forms.widgets.ImageHyperlink; /** * @author Willian Mitsuda @@ -146,6 +153,27 @@ public class TaskSelectionDialog extends SelectionStatusDialog { openInBrowserCheck.setSelection(openInBrowser); } + ImageHyperlink openHyperlink = new ImageHyperlink(area, SWT.NONE); + openHyperlink.setText(TaskListFilteredTree.LABEL_SEARCH); + openHyperlink.setForeground(TaskListColorsAndFonts.COLOR_HYPERLINK_WIDGET); + openHyperlink.setUnderlined(true); + openHyperlink.addHyperlinkListener(new IHyperlinkListener() { + + public void linkActivated(HyperlinkEvent e) { + getShell().close(); + new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open(); + } + + public void linkEntered(HyperlinkEvent e) { + // ignore + } + + public void linkExited(HyperlinkEvent e) { + // ignore + } + + }); + final TaskElementLabelProvider labelProvider = new TaskElementLabelProvider(true); viewer.setLabelProvider(labelProvider); viewer.setContentProvider(new ArrayContentProvider()); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractFilteredTree.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractFilteredTree.java index 01f981829..6e848d36f 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractFilteredTree.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractFilteredTree.java @@ -45,6 +45,8 @@ public abstract class AbstractFilteredTree extends FilteredTree { private Composite progressComposite; + private Composite searchComposite; + private boolean showProgress = false; private boolean eclipse_3_3_workbench = false; @@ -86,6 +88,13 @@ public abstract class AbstractFilteredTree extends FilteredTree { progressComposite = createProgressComposite(parent); progressComposite.setVisible(false); ((GridData) progressComposite.getLayoutData()).exclude = true; + + searchComposite = createSearchComposite(parent); + if (searchComposite != null) { + searchComposite.setVisible(false); + ((GridData) searchComposite.getLayoutData()).exclude = true; + } + return super.createTreeControl(parent, style); } @@ -169,6 +178,10 @@ public abstract class AbstractFilteredTree extends FilteredTree { protected abstract Composite createActiveTaskComposite(Composite container); + protected Composite createSearchComposite(Composite container) { + return null; + } + @Override protected void textChanged() { if (refreshPolicy != null) { @@ -200,4 +213,12 @@ public abstract class AbstractFilteredTree extends FilteredTree { ((GridData) progressComposite.getLayoutData()).exclude = !showProgress; getParent().getParent().layout(true, true); } + + public void setShowSearch(boolean showSearch) { + if (searchComposite != null) { + searchComposite.setVisible(showSearch); + ((GridData) searchComposite.getLayoutData()).exclude = !showSearch; + getParent().getParent().layout(true, true); + } + } } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java index 9bc936f86..5f091a915 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java @@ -29,7 +29,7 @@ import org.eclipse.swt.widgets.Listener; class CustomTaskListDecorationDrawer implements Listener { private final TaskListView taskListView; - + private int activationImageOffset; private Image taskActive = TasksUiImages.getImage(TasksUiImages.TASK_ACTIVE); @@ -86,6 +86,15 @@ class CustomTaskListDecorationDrawer implements Listener { drawSyncronizationImage((AbstractTaskContainer) data, event); } } + + // TODO: would be nice not to do this on each item's painting +// String text = tree.getFilterControl().getText(); +// System.err.println(">>>>>> " + tree.getViewer().getExpandedElements().length); +// if (text != null && !text.equals("") && tree.getViewer().getExpandedElements().length <= 12) { +// int offsetY = tree.getViewer().getExpandedElements().length * tree.getViewer().getTree().getItemHeight(); +// event.gc.drawText("Open search dialog...", 20, offsetY - 10); +// } + break; } case SWT.PaintItem: { @@ -95,6 +104,7 @@ class CustomTaskListDecorationDrawer implements Listener { if (data instanceof AbstractTaskContainer) { drawSyncronizationImage((AbstractTaskContainer) data, event); } + break; } } @@ -150,14 +160,6 @@ class CustomTaskListDecorationDrawer implements Listener { } } } -// if (container instanceof AbstractRepositoryQuery) { -// AbstractRepositoryQuery query = (AbstractRepositoryQuery) container; -// for (AbstractTask hit : query.getHits()) { -// if (hit.getSyncState() == RepositoryTaskSyncState.INCOMING) { -// return true; -// } -// } -// } return false; } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java index dc4f6a1e2..8f571a968 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java @@ -26,6 +26,7 @@ import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer; import org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor; import org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts; import org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink; +import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage; import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages; import org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskDialogAction; import org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskHistoryDropDownAction; @@ -41,6 +42,7 @@ import org.eclipse.mylyn.tasks.core.ITaskListChangeListener; import org.eclipse.mylyn.tasks.core.TaskContainerDelta; import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.tasks.ui.TasksUiUtil; +import org.eclipse.search.internal.ui.SearchDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MenuDetectEvent; import org.eclipse.swt.events.MenuDetectListener; @@ -70,6 +72,8 @@ public class TaskListFilteredTree extends AbstractFilteredTree { private static final String LABEL_SETS_MULTIPLE = "<multiple>"; + public static final String LABEL_SEARCH = "Search repository for key or summary..."; + private TaskListHyperlink workingSetLink; private TaskListHyperlink activeTaskLink; @@ -166,6 +170,40 @@ public class TaskListFilteredTree extends AbstractFilteredTree { return progressComposite; } + @Override + protected Composite createSearchComposite(Composite container) { + Composite searchComposite = new Composite(container, SWT.NONE); + GridLayout searchLayout = new GridLayout(1, false); + searchLayout.marginWidth = 8; + searchLayout.marginHeight = 0; + searchLayout.marginBottom = 0; + searchLayout.horizontalSpacing = 0; + searchLayout.verticalSpacing = 0; + searchComposite.setLayout(searchLayout); + searchComposite.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false, 4, 1)); + + final TaskListHyperlink searchLink = new TaskListHyperlink(searchComposite, SWT.LEFT); + searchLink.setText(LABEL_SEARCH); + searchLink.setForeground(TaskListColorsAndFonts.COLOR_HYPERLINK_WIDGET); + + searchLink.addHyperlinkListener(new IHyperlinkListener() { + + public void linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent e) { + new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open(); + } + + public void linkEntered(org.eclipse.ui.forms.events.HyperlinkEvent e) { + searchLink.setUnderlined(true); + } + + public void linkExited(org.eclipse.ui.forms.events.HyperlinkEvent e) { + searchLink.setUnderlined(false); + } + }); + + return searchComposite; + } + private void updateTaskProgressBar() { if (taskProgressBar.isDisposed()) { return; @@ -332,6 +370,16 @@ public class TaskListFilteredTree extends AbstractFilteredTree { return activeTaskLink; } + @Override + protected void textChanged() { + super.textChanged(); + if (getFilterString() != null && !getFilterString().trim().equals("")) { + setShowSearch(true); + } else { + setShowSearch(false); + } + } + public void indicateActiveTaskWorkingSet() { Set<IWorkingSet> activeSets = TaskListView.getActiveWorkingSets(); if (filterComposite.isDisposed() || activeSets == null) { |