Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkersten2007-08-27 21:56:55 +0000
committermkersten2007-08-27 21:56:55 +0000
commit3a9223611fd99f9db822a5dca33929a00f9511d2 (patch)
tree3f99c878110b957ed1a71a8223c2ed7e1d3adfd6
parentc439da2f06e4326e0d56902acf7f688d883a36d0 (diff)
downloadorg.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.xml22
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java167
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SearchForRepositoryTask.java43
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java28
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractFilteredTree.java21
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java20
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java48
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 &amp;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) {

Back to the top