diff options
8 files changed, 123 insertions, 291 deletions
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Messages.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Messages.java index ff30a4598..74edc8be5 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Messages.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Messages.java @@ -66,4 +66,11 @@ public class Messages extends NLS { public static String TaskJobFactory_Refreshing_repository_configuration; public static String TaskJobFactory_Receiving_configuration; + + public static String TaskRelation_Dependency; + + public static String TaskRelation_Parent; + + public static String TaskRelation_Subtask; + } diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/messages.properties b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/messages.properties index c61315455..23c715cab 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/messages.properties +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/messages.properties @@ -38,3 +38,7 @@ ScheduledTaskContainer_Date_Day_Pattern={0} - {1} TaskJobFactory_Refreshing_repository_configuration=Refreshing repository configuration TaskJobFactory_Receiving_configuration=Receiving configuration + +TaskRelation_Dependency=Dependency +TaskRelation_Parent=Parent +TaskRelation_Subtask=Subtask diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskRelation.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskRelation.java index 55cdfb6cd..14fb166f5 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskRelation.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskRelation.java @@ -12,6 +12,7 @@ package org.eclipse.mylyn.tasks.core.data; import org.eclipse.core.runtime.Assert; +import org.eclipse.mylyn.internal.tasks.core.Messages; /** * @author Steffen Pingel @@ -114,4 +115,16 @@ public class TaskRelation { TaskRelation other = (TaskRelation) obj; return direction.equals(other.direction) && kind.equals(other.kind) && taskId.equals(other.taskId); } + + @Override + public String toString() { + if (kind == Kind.CONTAINMENT && direction == Direction.INWARD) { + return Messages.TaskRelation_Parent; + } else if (kind == Kind.CONTAINMENT && direction == Direction.OUTWARD) { + return Messages.TaskRelation_Subtask; + } else { + return Messages.TaskRelation_Dependency; + } + } + } 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 index 10308e32d..350ba97a3 100644 --- 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 @@ -32,6 +32,7 @@ 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.DecoratingPatternStyledCellLabelProvider; 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; @@ -151,7 +152,7 @@ public class RepositorySearchResultView extends AbstractTextSearchViewPage imple private SearchResultSortAction sortByDialogAction; - private RepositorySearchStyledLabelProvider styledLabelProvider; + private DecoratingPatternStyledCellLabelProvider styledLabelProvider; private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() { public String[] getShowInTargetIds() { @@ -221,7 +222,7 @@ public class RepositorySearchResultView extends AbstractTextSearchViewPage imple searchResultProvider = new SearchResultTreeContentProvider(); viewer.setContentProvider(searchResultProvider); - styledLabelProvider = new RepositorySearchStyledLabelProvider(new SearchResultsLabelProvider( + styledLabelProvider = new DecoratingPatternStyledCellLabelProvider(new SearchResultsLabelProvider( searchResultProvider, viewer), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), null); viewer.setLabelProvider(styledLabelProvider); diff --git a/org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchStyledLabelProvider.java b/org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchStyledLabelProvider.java deleted file mode 100644 index 6179cc4e3..000000000 --- a/org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchStyledLabelProvider.java +++ /dev/null @@ -1,241 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - * Perforce - enhancements for bug 319469 - *******************************************************************************/ - -package org.eclipse.mylyn.internal.tasks.ui.search; - -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.IColorProvider; -import org.eclipse.jface.viewers.IDecorationContext; -import org.eclipse.jface.viewers.IFontProvider; -import org.eclipse.jface.viewers.ILabelDecorator; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.StyledCellLabelProvider; -import org.eclipse.jface.viewers.StyledString; -import org.eclipse.jface.viewers.ViewerColumn; -import org.eclipse.search.internal.ui.text.DecoratingFileSearchLabelProvider; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StyleRange; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.Image; -import org.eclipse.ui.IWorkbenchPreferenceConstants; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.internal.misc.StringMatcher; -import org.eclipse.ui.internal.misc.StringMatcher.Position; - -/** - * Repository search styled label provider. Based on {@link DecoratingFileSearchLabelProvider}. - * - * @author Kevin Sawicki - * @see DecoratingFileSearchLabelProvider - */ -public class RepositorySearchStyledLabelProvider extends DecoratingStyledCellLabelProvider implements - IPropertyChangeListener, ILabelProvider { - - /** - * Color to use to decorate matches. - */ - public static final String HIGHLIGHT_BG_COLOR_NAME = "org.eclipse.jdt.ui.ColoredLabels.match_highlight"; //$NON-NLS-1$ - - private static class PatternStyledLabelProvider extends StyledCellLabelProvider implements IStyledLabelProvider, - IColorProvider, IFontProvider { - - private final SearchResultsLabelProvider labelProvider; - - private StringMatcher matcher = null; - - public PatternStyledLabelProvider(SearchResultsLabelProvider provider) { - this.labelProvider = provider; - } - - /** - * Set the pattern to highlight - * - * @param pattern - */ - public void setPattern(String pattern) { - if (pattern != null && pattern.length() > 0) { - this.matcher = new StringMatcher(pattern, true, false); - } else { - this.matcher = null; - } - } - - public StyledString getStyledText(Object element) { - StyledString styled = null; - String label = this.labelProvider.getText(element); - if (matcher == null || label.length() == 0) { - styled = new StyledString(label); - } else { - styled = new StyledString(); - int start = 0; - int end = 0; - int length = label.length(); - Position position = matcher.find(label, start, length); - while (position != null) { - end = position.getStart(); - styled.append(label.substring(start, end)); - start = position.getEnd(); - styled.append(label.substring(end, start), DecoratingFileSearchLabelProvider.HIGHLIGHT_STYLE); - position = matcher.find(label, start, length); - } - if (start > 0 && start < length) { - styled.append(label.substring(start)); - } - } - return styled; - } - - public Image getImage(Object element) { - return this.labelProvider.getImage(element); - } - - public Font getFont(Object element) { - return this.labelProvider.getFont(element); - } - - public Color getForeground(Object element) { - return this.labelProvider.getForeground(element); - } - - public Color getBackground(Object element) { - return this.labelProvider.getBackground(element); - } - - } - - private final ILabelProvider labelProvider; - - /** - * Create a new repository search styled label provider that wraps an {@link ILabelProvider} - * - * @param labelProvider - * @param decorator - * @param decorationContext - */ - public RepositorySearchStyledLabelProvider(SearchResultsLabelProvider labelProvider, ILabelDecorator decorator, - IDecorationContext decorationContext) { - super(new PatternStyledLabelProvider(labelProvider), decorator, decorationContext); - this.labelProvider = labelProvider; - } - - /** - * @see org.eclipse.jface.viewers.StyledCellLabelProvider#initialize(org.eclipse.jface.viewers.ColumnViewer, - * org.eclipse.jface.viewers.ViewerColumn) - */ - @Override - public void initialize(ColumnViewer viewer, ViewerColumn column) { - PlatformUI.getPreferenceStore().addPropertyChangeListener(this); - JFaceResources.getColorRegistry().addListener(this); - - setOwnerDrawEnabled(PlatformUI.getPreferenceStore() - .getBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS)); - - super.initialize(viewer, column); - } - - /** - * Get underyling label provider - * - * @return label provider - */ - public ILabelProvider getLabelProvider() { - return this.labelProvider; - } - - /** - * @see org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider#dispose() - */ - @Override - public void dispose() { - PlatformUI.getPreferenceStore().removePropertyChangeListener(this); - JFaceResources.getColorRegistry().removeListener(this); - this.labelProvider.dispose(); - super.dispose(); - } - - /** - * Set the pattern to highlight - * - * @param pattern - */ - public void setPattern(String pattern) { - ((PatternStyledLabelProvider) getStyledStringProvider()).setPattern(pattern); - } - - /** - * Refresh the labels on viewer associated with this label provider. This method must be called on the UI-thread. - */ - protected void refresh() { - ColumnViewer viewer = getViewer(); - if (viewer != null) { - boolean coloredLabels = PlatformUI.getPreferenceStore().getBoolean( - IWorkbenchPreferenceConstants.USE_COLORED_LABELS); - if (coloredLabels || coloredLabels != isOwnerDrawEnabled()) { - setOwnerDrawEnabled(coloredLabels); - viewer.refresh(); - } - } - } - - /** - * Schedule a refresh of this label provider. This method can be called from any thread. - */ - protected void scheduleRefresh() { - PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { - public void run() { - refresh(); - } - }); - } - - /** - * @param event - */ - public void propertyChange(PropertyChangeEvent event) { - String property = event.getProperty(); - if (IWorkbenchPreferenceConstants.USE_COLORED_LABELS.equals(property) - || HIGHLIGHT_BG_COLOR_NAME.equals(property)) { - scheduleRefresh(); - } - } - - /** - * Get text of element from underyling label provider - * - * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) - */ - public String getText(Object element) { - return this.labelProvider.getText(element); - } - - /** - * Override preparation of style range to add border dot about highlight regions that don't have colors applied - * - * @see org.eclipse.jface.viewers.StyledCellLabelProvider#prepareStyleRange(org.eclipse.swt.custom.StyleRange, - * boolean) - */ - @Override - protected StyleRange prepareStyleRange(StyleRange styleRange, boolean applyColors) { - boolean addBorder = !applyColors && styleRange.background != null; - styleRange = super.prepareStyleRange(styleRange, applyColors); - if (addBorder) { - styleRange.borderStyle = SWT.BORDER_DOT; - } - return styleRange; - } - -} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/Messages.java index a427243a6..8150032ba 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/Messages.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/Messages.java @@ -16,6 +16,8 @@ import org.eclipse.osgi.util.NLS; public class Messages extends NLS { private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.editors.outline.messages"; //$NON-NLS-1$ + public static String QuickOutlineDialog_Node_Label_Decoration; + public static String QuickOutlineDialog_Press_Esc_Info_Text; static { // initialize resource bundle diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/QuickOutlineDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/QuickOutlineDialog.java index 20ce60fa3..a5e062251 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/QuickOutlineDialog.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/QuickOutlineDialog.java @@ -23,17 +23,22 @@ import org.eclipse.jface.text.IInformationControlExtension2; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.ILabelDecorator; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; +import org.eclipse.mylyn.internal.provisional.commons.ui.DecoratingPatternStyledCellLabelProvider; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineContentProvider; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineModel; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode; import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage; import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; +import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; @@ -50,6 +55,7 @@ import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -72,6 +78,48 @@ import org.eclipse.ui.forms.editor.IFormPage; public class QuickOutlineDialog extends PopupDialog implements IInformationControl, IInformationControlExtension, IInformationControlExtension2, DisposeListener { + public final class Filter extends PatternFilter { + @Override + protected boolean wordMatches(String text) { + return super.wordMatches(text); + } + } + + public final class TaskEditorOutlineLabelDecorator implements ILabelDecorator { + + public String decorateText(String text, Object element) { + if (element instanceof TaskEditorOutlineNode) { + TaskEditorOutlineNode node = (TaskEditorOutlineNode) element; + if (node.getTaskRelation() != null) { + return NLS.bind(Messages.QuickOutlineDialog_Node_Label_Decoration, text, node.getTaskRelation() + .toString()); + } + } + return null; + } + + public void addListener(ILabelProviderListener listener) { + // ignore + } + + public void dispose() { + // ignore + } + + public boolean isLabelProperty(Object element, String property) { + return false; + } + + public void removeListener(ILabelProviderListener listener) { + // ignore + } + + public Image decorateImage(Image image, Object element) { + return null; + } + + } + private class OpenListener implements IOpenListener, IDoubleClickListener, MouseListener { private final Viewer viewer; @@ -126,7 +174,7 @@ public class QuickOutlineDialog extends PopupDialog implements IInformationContr private Text filterText; - private PatternFilter namePatternFilter; + private Filter namePatternFilter; private OpenListener openListener; @@ -162,7 +210,7 @@ public class QuickOutlineDialog extends PopupDialog implements IInformationContr viewer.addOpenListener(openListener); viewer.getTree().addMouseListener(openListener); - namePatternFilter = new PatternFilter(); + namePatternFilter = new Filter(); namePatternFilter.setIncludeLeadingWildcard(true); viewer.addFilter(namePatternFilter); @@ -188,7 +236,8 @@ public class QuickOutlineDialog extends PopupDialog implements IInformationContr viewer.setUseHashlookup(true); viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer.setContentProvider(new TaskEditorOutlineContentProvider()); - viewer.setLabelProvider(new QuickOutlineLabelProvider()); + viewer.setLabelProvider(new DecoratingPatternStyledCellLabelProvider(new QuickOutlineLabelProvider(), + new TaskEditorOutlineLabelDecorator(), null)); return viewer; } @@ -473,7 +522,7 @@ public class QuickOutlineDialog extends PopupDialog implements IInformationContr viewer.getControl().setRedraw(false); viewer.refresh(); viewer.expandAll(); -// selectFirstMatch(); + selectFirstMatch(); viewer.getControl().setRedraw(true); } @@ -494,49 +543,45 @@ public class QuickOutlineDialog extends PopupDialog implements IInformationContr return taskEditorPage; } -// /** -// * Selects the first element in the tree which matches the current filter pattern. -// */ -// private void selectFirstMatch() { -// Tree tree = viewer.getTree(); -// Object element = findFirstMatchToPattern(tree.getItems()); -// if (element != null) { -// viewer.setSelection(new StructuredSelection(element), true); -// } else { -// viewer.setSelection(StructuredSelection.EMPTY); -// } -// } -// -// /** -// * @param items -// * @return -// */ -// private Object findFirstMatchToPattern(TreeItem[] items) { -// // Match the string pattern against labels -// ILabelProvider labelProvider = (ILabelProvider) viewer.getLabelProvider(); -// // Process each item in the tree -// for (TreeItem item : items) { -// Object element = item.getData(); -// // Return the first element if no pattern is set -// if (fStringMatcher == null) { -// return element; -// } -// // Return the element if it matches the pattern -// if (element != null) { -// String label = labelProvider.getText(element); -// if (fStringMatcher.match(label)) { -// return element; -// } -// } -// // Recursively check the elements children for a match -// element = findFirstMatchToPattern(item.getItems()); -// // Return the child element match if found -// if (element != null) { -// return element; -// } -// } -// // No match found -// return null; -// } + /** + * Selects the first element in the tree which matches the current filter pattern. + */ + private void selectFirstMatch() { + Tree tree = viewer.getTree(); + Object element = findFirstMatchToPattern(tree.getItems()); + if (element != null) { + viewer.setSelection(new StructuredSelection(element), true); + } else { + viewer.setSelection(StructuredSelection.EMPTY); + } + } + + /** + * @param items + * @return + */ + private Object findFirstMatchToPattern(TreeItem[] items) { + // Match the string pattern against labels + ILabelProvider labelProvider = (ILabelProvider) viewer.getLabelProvider(); + // Process each item in the tree + for (TreeItem item : items) { + Object element = item.getData(); + // Return the element if it matches the pattern + if (element != null) { + String label = labelProvider.getText(element); + if (namePatternFilter.wordMatches(label)) { + return element; + } + } + // Recursively check the elements children for a match + element = findFirstMatchToPattern(item.getItems()); + // Return the child element match if found + if (element != null) { + return element; + } + } + // No match found + return null; + } } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/messages.properties index 7c7f7bc60..c16a81814 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/messages.properties +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/outline/messages.properties @@ -8,4 +8,5 @@ # Contributors: # Tasktop Technologies - initial API and implementation ############################################################################### +QuickOutlineDialog_Node_Label_Decoration={0} [{1}] QuickOutlineDialog_Press_Esc_Info_Text=Press 'Esc' to exit the dialog. |