diff options
author | fbecker | 2010-03-01 21:44:18 +0000 |
---|---|---|
committer | fbecker | 2010-03-01 21:44:18 +0000 |
commit | f71e3e9e73f3c761b547a906eda1287655be8553 (patch) | |
tree | bb015e24027970d8843b33793f4e7f76a5749559 /org.eclipse.mylyn.tasks.ui | |
parent | 864f1a68d01f919a723c80b840b420f4fc9374e8 (diff) | |
download | org.eclipse.mylyn.tasks-f71e3e9e73f3c761b547a906eda1287655be8553.tar.gz org.eclipse.mylyn.tasks-f71e3e9e73f3c761b547a906eda1287655be8553.tar.xz org.eclipse.mylyn.tasks-f71e3e9e73f3c761b547a906eda1287655be8553.zip |
ASSIGNED - bug 303531: [patch] refactor CATEGORY_GRADIENT_DRAWER out of TaskListViewer
https://bugs.eclipse.org/bugs/show_bug.cgi?id=303531
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui')
3 files changed, 212 insertions, 144 deletions
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 f10068688..002976ec6 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 @@ -16,7 +16,6 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.mylyn.context.core.ContextCore; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; -import org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.core.TaskCategory; @@ -44,8 +43,6 @@ import org.eclipse.swt.widgets.TreeItem; */ public class CustomTaskListDecorationDrawer implements Listener { - private final DelayedRefreshJob delayedRefreshJob; - private final int activationImageOffset; private final Image taskActive = CommonImages.getImage(TasksUiImages.CONTEXT_ACTIVE); @@ -73,19 +70,16 @@ public class CustomTaskListDecorationDrawer implements Listener { if (event.getProperty().equals(ITasksUiPreferenceConstants.USE_STRIKETHROUGH_FOR_COMPLETED)) { if (event.getNewValue() instanceof Boolean) { useStrikethroughForCompleted = (Boolean) event.getNewValue(); - delayedRefreshJob.refresh(); } } else if (event.getProperty().equals(ITasksUiPreferenceConstants.OVERLAYS_INCOMING_TIGHT)) { if (event.getNewValue() instanceof Boolean) { synchronizationOverlaid = (Boolean) event.getNewValue(); - delayedRefreshJob.refresh(); } } } }; - CustomTaskListDecorationDrawer(DelayedRefreshJob delayedRefreshJob, int activationImageOffset, boolean focusedMode) { - this.delayedRefreshJob = delayedRefreshJob; + public CustomTaskListDecorationDrawer(int activationImageOffset, boolean focusedMode) { this.activationImageOffset = activationImageOffset; this.lastClippingArea = new Rectangle(0, 0, 0, 0); this.tweakClipping = PlatformUtil.isPaintItemClippingRequired(); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/GradientDrawer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/GradientDrawer.java new file mode 100644 index 000000000..10b13dd1b --- /dev/null +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/GradientDrawer.java @@ -0,0 +1,204 @@ +/******************************************************************************* + * Copyright (c) 2010 Frank Becker 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: + * Frank Becker - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.ui.views; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.mylyn.commons.core.StatusHandler; +import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes; +import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.tasks.core.ITask; +import org.eclipse.mylyn.tasks.core.ITaskContainer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.graphics.Region; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Scrollable; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.ui.themes.IThemeManager; + +public class GradientDrawer { + + private final Listener CATEGORY_GRADIENT_DRAWER = new Listener() { + public void handleEvent(Event event) { + if (event.item.getData() instanceof ITaskContainer && !(event.item.getData() instanceof ITask)) { + Scrollable scrollable = (Scrollable) event.widget; + GC gc = event.gc; + + Rectangle area = scrollable.getClientArea(); + Rectangle rect = event.getBounds(); + + /* Paint the selection beyond the end of last column */ + expandRegion(event, scrollable, gc, area); + + /* Draw Gradient Rectangle */ + Color oldForeground = gc.getForeground(); + Color oldBackground = gc.getBackground(); + + gc.setForeground(categoryGradientEnd); + gc.drawLine(0, rect.y, area.width, rect.y); + + gc.setForeground(categoryGradientStart); + gc.setBackground(categoryGradientEnd); + + // gc.setForeground(categoryGradientStart); + // gc.setBackground(categoryGradientEnd); + // gc.setForeground(new Clr(Display.getCurrent(), 255, 0, 0)); + + gc.fillGradientRectangle(0, rect.y + 1, area.width, rect.height, true); + + /* Bottom Line */ + // gc.setForeground(); + gc.setForeground(categoryGradientEnd); + gc.drawLine(0, rect.y + rect.height - 1, area.width, rect.y + rect.height - 1); + + gc.setForeground(oldForeground); + gc.setBackground(oldBackground); + /* Mark as Background being handled */ + event.detail &= ~SWT.BACKGROUND; + } + } + + private void expandRegion(Event event, Scrollable scrollable, GC gc, Rectangle area) { + int columnCount; + if (scrollable instanceof Table) { + columnCount = ((Table) scrollable).getColumnCount(); + } else { + columnCount = ((Tree) scrollable).getColumnCount(); + } + + if (event.index == columnCount - 1 || columnCount == 0) { + int width = area.x + area.width - event.x; + if (width > 0) { + Region region = new Region(); + gc.getClipping(region); + region.add(event.x, event.y, width, event.height); + gc.setClipping(region); + region.dispose(); + } + } + } + }; + + private final IPropertyChangeListener THEME_CHANGE_LISTENER = new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME) + || event.getProperty().equals(CommonThemes.COLOR_SCHEDULED_PAST) + || event.getProperty().equals(CommonThemes.COLOR_COMPLETED_TODAY) + || event.getProperty().equals(CommonThemes.COLOR_COMPLETED) + || event.getProperty().equals(CommonThemes.COLOR_OVERDUE) + || event.getProperty().equals(CommonThemes.COLOR_SCHEDULED_TODAY) + || event.getProperty().equals(CommonThemes.COLOR_SCHEDULED_PAST) + || event.getProperty().equals(CommonThemes.COLOR_SCHEDULED_TODAY) + || event.getProperty().equals(CommonThemes.COLOR_SCHEDULED_THIS_WEEK) + || event.getProperty().equals(CommonThemes.COLOR_TASK_ACTIVE) + || CommonThemes.isCommonTheme(event.getProperty())) { + configureGradientColors(); + } + } + }; + + private boolean gradientListenerAdded = false; + + private final IThemeManager themeManager; + + private Color categoryGradientStart; + + private Color categoryGradientEnd; + + private final TreeViewer treeViewer; + + public GradientDrawer(IThemeManager theThemeManager, TreeViewer treeViewer) { + this.themeManager = theThemeManager; + this.treeViewer = treeViewer; + treeViewer.getControl().addDisposeListener(new DisposeListener() { + + public void widgetDisposed(DisposeEvent e) { + if (themeManager != null) { + themeManager.removePropertyChangeListener(THEME_CHANGE_LISTENER); + } + } + }); + configureGradientColors(); + themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER); + } + + private void configureGradientColors() { + categoryGradientStart = themeManager.getCurrentTheme().getColorRegistry().get( + CommonThemes.COLOR_CATEGORY_GRADIENT_START); + categoryGradientEnd = themeManager.getCurrentTheme().getColorRegistry().get( + CommonThemes.COLOR_CATEGORY_GRADIENT_END); + + boolean customized = true; + if (categoryGradientStart != null && categoryGradientStart.getRed() == 240 + && categoryGradientStart.getGreen() == 240 && categoryGradientStart.getBlue() == 240 + && categoryGradientEnd != null && categoryGradientEnd.getRed() == 220 + && categoryGradientEnd.getGreen() == 220 && categoryGradientEnd.getBlue() == 220) { + customized = false; + } + + if (gradientListenerAdded == false && categoryGradientStart != null + && !categoryGradientStart.equals(categoryGradientEnd)) { + getViewer().getTree().addListener(SWT.EraseItem, CATEGORY_GRADIENT_DRAWER); + gradientListenerAdded = true; + if (!customized) { + // Set parent-based colors + Color parentBackground = getViewer().getTree().getParent().getBackground(); + double GRADIENT_TOP = 1.05;// 1.02; + double GRADIENT_BOTTOM = .995;// 1.035; + + int red = Math.min(255, (int) (parentBackground.getRed() * GRADIENT_TOP)); + int green = Math.min(255, (int) (parentBackground.getGreen() * GRADIENT_TOP)); + int blue = Math.min(255, (int) (parentBackground.getBlue() * GRADIENT_TOP)); + + try { + categoryGradientStart = new Color(Display.getDefault(), red, green, blue); + } catch (Exception e) { + categoryGradientStart = getViewer().getTree().getParent().getBackground(); + StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set color: " + red //$NON-NLS-1$ + + ", " + green + ", " + blue, e)); //$NON-NLS-1$ //$NON-NLS-2$ + } + red = Math.max(0, (int) (parentBackground.getRed() / GRADIENT_BOTTOM)); + green = Math.max(0, (int) (parentBackground.getGreen() / GRADIENT_BOTTOM)); + blue = Math.max(0, (int) (parentBackground.getBlue() / GRADIENT_BOTTOM)); + if (red > 255) { + red = 255; + } + try { + categoryGradientEnd = new Color(Display.getDefault(), red, green, blue); + } catch (Exception e) { + categoryGradientStart = getViewer().getTree().getParent().getBackground(); + StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set color: " + red //$NON-NLS-1$ + + ", " + green + ", " + blue, e)); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } else if (categoryGradientStart != null && categoryGradientStart.equals(categoryGradientEnd)) { + getViewer().getTree().removeListener(SWT.EraseItem, CATEGORY_GRADIENT_DRAWER); + gradientListenerAdded = false; + } + } + + public TreeViewer getViewer() { + return treeViewer; + } + +} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java index 82325e15b..6d68829fd 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java @@ -127,18 +127,11 @@ import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.graphics.Region; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.Scrollable; -import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; @@ -389,14 +382,10 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener, I private TaskListSorter tableSorter; - private Color categoryGradientStart; - - private Color categoryGradientEnd; + private TaskListViewActionGroup actionGroup; private CustomTaskListDecorationDrawer customDrawer; - private TaskListViewActionGroup actionGroup; - private final IPageListener PAGE_LISTENER = new IPageListener() { public void pageActivated(IWorkbenchPage page) { filteredTree.indicateActiveTaskWorkingSet(); @@ -420,69 +409,6 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener, I */ protected boolean isPaused = false; - private final Listener CATEGORY_GRADIENT_DRAWER = new Listener() { - public void handleEvent(Event event) { - if (event.item.getData() instanceof ITaskContainer && !(event.item.getData() instanceof ITask)) { - Scrollable scrollable = (Scrollable) event.widget; - GC gc = event.gc; - - Rectangle area = scrollable.getClientArea(); - Rectangle rect = event.getBounds(); - - /* Paint the selection beyond the end of last column */ - expandRegion(event, scrollable, gc, area); - - /* Draw Gradient Rectangle */ - Color oldForeground = gc.getForeground(); - Color oldBackground = gc.getBackground(); - - gc.setForeground(categoryGradientEnd); - gc.drawLine(0, rect.y, area.width, rect.y); - - gc.setForeground(categoryGradientStart); - gc.setBackground(categoryGradientEnd); - - // gc.setForeground(categoryGradientStart); - // gc.setBackground(categoryGradientEnd); - // gc.setForeground(new Clr(Display.getCurrent(), 255, 0, 0)); - - gc.fillGradientRectangle(0, rect.y + 1, area.width, rect.height, true); - - /* Bottom Line */ - // gc.setForeground(); - gc.setForeground(categoryGradientEnd); - gc.drawLine(0, rect.y + rect.height - 1, area.width, rect.y + rect.height - 1); - - gc.setForeground(oldForeground); - gc.setBackground(oldBackground); - /* Mark as Background being handled */ - event.detail &= ~SWT.BACKGROUND; - } - } - - private void expandRegion(Event event, Scrollable scrollable, GC gc, Rectangle area) { - int columnCount; - if (scrollable instanceof Table) { - columnCount = ((Table) scrollable).getColumnCount(); - } else { - columnCount = ((Tree) scrollable).getColumnCount(); - } - - if (event.index == columnCount - 1 || columnCount == 0) { - int width = area.x + area.width - event.x; - if (width > 0) { - Region region = new Region(); - gc.getClipping(region); - region.add(event.x, event.y, width, event.height); - gc.setClipping(region); - region.dispose(); - } - } - } - }; - - private boolean gradientListenerAdded = false; - private final ITaskActivityListener TASK_ACTIVITY_LISTENER = new TaskActivityAdapter() { @Override public void activityReset() { @@ -573,7 +499,6 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener, I public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME) || CommonThemes.isCommonTheme(event.getProperty())) { - configureGradientColors(); taskListTableLabelProvider.setCategoryBackgroundColor(themeManager.getCurrentTheme() .getColorRegistry() .get(CommonThemes.COLOR_CATEGORY)); @@ -587,66 +512,15 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener, I if (ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED.equals(event.getProperty())) { updateTooltipEnablement(); } + if (event.getProperty().equals(ITasksUiPreferenceConstants.USE_STRIKETHROUGH_FOR_COMPLETED) + || event.getProperty().equals(ITasksUiPreferenceConstants.OVERLAYS_INCOMING_TIGHT)) { + refreshJob.refresh(); + } } }; private TaskListToolTip taskListToolTip; - private void configureGradientColors() { - categoryGradientStart = themeManager.getCurrentTheme().getColorRegistry().get( - CommonThemes.COLOR_CATEGORY_GRADIENT_START); - categoryGradientEnd = themeManager.getCurrentTheme().getColorRegistry().get( - CommonThemes.COLOR_CATEGORY_GRADIENT_END); - - boolean customized = true; - if (categoryGradientStart != null && categoryGradientStart.getRed() == 240 - && categoryGradientStart.getGreen() == 240 && categoryGradientStart.getBlue() == 240 - && categoryGradientEnd != null && categoryGradientEnd.getRed() == 220 - && categoryGradientEnd.getGreen() == 220 && categoryGradientEnd.getBlue() == 220) { - customized = false; - } - - if (gradientListenerAdded == false && categoryGradientStart != null - && !categoryGradientStart.equals(categoryGradientEnd)) { - getViewer().getTree().addListener(SWT.EraseItem, CATEGORY_GRADIENT_DRAWER); - gradientListenerAdded = true; - if (!customized) { - // Set parent-based colors - Color parentBackground = getViewer().getTree().getParent().getBackground(); - double GRADIENT_TOP = 1.05;// 1.02; - double GRADIENT_BOTTOM = .995;// 1.035; - - int red = Math.min(255, (int) (parentBackground.getRed() * GRADIENT_TOP)); - int green = Math.min(255, (int) (parentBackground.getGreen() * GRADIENT_TOP)); - int blue = Math.min(255, (int) (parentBackground.getBlue() * GRADIENT_TOP)); - - try { - categoryGradientStart = new Color(Display.getDefault(), red, green, blue); - } catch (Exception e) { - categoryGradientStart = getViewer().getTree().getParent().getBackground(); - StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set color: " + red //$NON-NLS-1$ - + ", " + green + ", " + blue, e)); //$NON-NLS-1$ //$NON-NLS-2$ - } - red = Math.max(0, (int) (parentBackground.getRed() / GRADIENT_BOTTOM)); - green = Math.max(0, (int) (parentBackground.getGreen() / GRADIENT_BOTTOM)); - blue = Math.max(0, (int) (parentBackground.getBlue() / GRADIENT_BOTTOM)); - if (red > 255) { - red = 255; - } - try { - categoryGradientEnd = new Color(Display.getDefault(), red, green, blue); - } catch (Exception e) { - categoryGradientStart = getViewer().getTree().getParent().getBackground(); - StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set color: " + red //$NON-NLS-1$ - + ", " + green + ", " + blue, e)); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } else if (categoryGradientStart != null && categoryGradientStart.equals(categoryGradientEnd)) { - getViewer().getTree().removeListener(SWT.EraseItem, CATEGORY_GRADIENT_DRAWER); - gradientListenerAdded = false; - } - } - public static TaskListView getFromActivePerspective() { if (PlatformUI.isWorkbenchRunning()) { IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); @@ -694,10 +568,6 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener, I if (editorListener != null) { getSite().getPage().removePartListener(editorListener); } - - customDrawer.dispose(); - categoryGradientStart.dispose(); - categoryGradientEnd.dispose(); } private void updateDescription() { @@ -917,7 +787,7 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener, I getViewer().setInput(getViewSite()); final int activationImageOffset = PlatformUtil.getTreeImageOffset(); - customDrawer = new CustomTaskListDecorationDrawer(refreshJob, activationImageOffset, focusedMode); + customDrawer = new CustomTaskListDecorationDrawer(activationImageOffset, false); getViewer().getTree().addListener(SWT.EraseItem, customDrawer); getViewer().getTree().addListener(SWT.PaintItem, customDrawer); @@ -1016,7 +886,7 @@ public class TaskListView extends ViewPart implements IPropertyChangeListener, I contributeToActionBars(); initHandlers(); - configureGradientColors(); + new GradientDrawer(themeManager, getViewer()); initDragAndDrop(parent); expandToActiveTasks(); |