diff options
author | Jaxsun McCarthy Huggan | 2016-05-25 23:04:46 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2016-05-27 20:15:26 +0000 |
commit | 7ebe840367437541244ec57906d28629c4db9c1d (patch) | |
tree | 7364b951c6361f06e5bd245af63ca6cad46da068 | |
parent | 7d93772224d925b59be2277991856e958bb9a188 (diff) | |
download | org.eclipse.mylyn.tasks-7ebe840367437541244ec57906d28629c4db9c1d.tar.gz org.eclipse.mylyn.tasks-7ebe840367437541244ec57906d28629c4db9c1d.tar.xz org.eclipse.mylyn.tasks-7ebe840367437541244ec57906d28629c4db9c1d.zip |
494596: TaskListToolTip should not compute a TaskDataDiff when
displaying the tooltip
Change-Id: Id5a075992c8a23335a501ea987bf7d019a81ca74
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=494596
Signed-off-by: Jaxsun McCarthy Huggan <jaxsun.mccarthy@tasktop.com>
3 files changed, 89 insertions, 69 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDiffUtil.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDiffUtil.java index 1b08c07d6..bf40a93e5 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDiffUtil.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDiffUtil.java @@ -33,16 +33,15 @@ public class TaskDiffUtil { private static final int MAX_CHANGED_ATTRIBUTES = 2; // could use the ellipsis glyph on some platforms "\u2026" - private static final String ELLIPSIS = "..."; //$NON-NLS-1$ + private static final String ELLIPSIS = "..."; //$NON-NLS-1$ private static int DRAW_FLAGS = SWT.DRAW_MNEMONIC | SWT.DRAW_TAB | SWT.DRAW_TRANSPARENT | SWT.DRAW_DELIMITER; public static String toString(TaskDataDiff diff) { - return toString(diff, 60, true); + return toString(diff, true); } - // TODO implement trim based on text width - public static String toString(TaskDataDiff diff, int maxWidth, boolean includeNewest) { + public static String toString(TaskDataDiff diff, boolean includeNewest) { StringBuilder sb = new StringBuilder(); String sep = ""; //$NON-NLS-1$ // append first comment @@ -62,7 +61,7 @@ public class TaskDiffUtil { } sep = "\n"; //$NON-NLS-1$ } - // append changed attributes + // append changed attributes int n = 0; for (ITaskAttributeDiff changedAttribute : diff.getChangedAttributes()) { TaskAttributeDiff attributeDiff = (TaskAttributeDiff) changedAttribute; @@ -168,7 +167,7 @@ public class TaskDiffUtil { * Note: Copied from CLabel. Shorten the given text <code>t</code> so that its length doesn't exceed the given * width. The default implementation replaces characters in the center of the original string with an ellipsis * ("..."). Override if you need a different strategy. - * + * * @param gc * the gc to use for text measurement * @param t diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java index 7451cd5d8..d90e08cea 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java @@ -37,11 +37,15 @@ import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.TasksUi; +import com.google.common.base.Strings; + /** * @author Steffen Pingel */ public class TaskListNotifier implements ITaskDataManagerListener, ITaskListNotificationProvider { + public final static String KEY_INCOMING_NOTIFICATION_TEXT = "org.eclipse.mylyn.tasks.ui.TaskNotificationText"; //$NON-NLS-1$ + private final TaskDataManager taskDataManager; private final List<TaskListNotification> notificationQueue = new ArrayList<TaskListNotification>(); @@ -60,15 +64,16 @@ public class TaskListNotifier implements ITaskDataManagerListener, ITaskListNoti TaskListNotification notification = new TaskListNotification(task, token); notification.setDescription(Messages.TaskListNotifier_New_unread_task); return notification; - } else if (task.getSynchronizationState() == SynchronizationState.INCOMING) { - TaskDataDiff diff = getDiff(task); - if (diff != null && diff.hasChanged()) { + } else if (task.getSynchronizationState().isIncoming()) { + String notificationText = task.getAttribute(KEY_INCOMING_NOTIFICATION_TEXT); + if (!Strings.isNullOrEmpty(notificationText)) { TaskListNotification notification = new TaskListNotification(task, token); - notification.setDescription(TaskDiffUtil.toString(diff, 60, true)); + notification.setDescription(notificationText); return notification; } } return null; + } public TaskDataDiff getDiff(ITask task) { @@ -86,23 +91,23 @@ public class TaskListNotifier implements ITaskDataManagerListener, ITaskListNoti return null; } + @Override public void taskDataUpdated(TaskDataManagerEvent event) { - synchronized (notificationQueue) { - if (!enabled) { - // skip expensive processing - return; - } - } if (event.getToken() != null && event.getTaskDataChanged()) { - if (PresentationFilter.getInstance().isInVisibleQuery(event.getTask())) { - AbstractRepositoryConnectorUi connectorUi = TasksUi.getRepositoryConnectorUi(event.getTaskData() - .getConnectorKind()); - if (!connectorUi.hasCustomNotifications()) { - TaskListNotification notification = getNotification(event.getTask(), event.getToken()); - if (notification != null) { - synchronized (notificationQueue) { - if (enabled) { - notificationQueue.add(notification); + // always compute the incoming message as it may be used outside of the notification + recordNotificationText(event); + + if (isEnabled()) { + if (PresentationFilter.getInstance().isInVisibleQuery(event.getTask())) { + AbstractRepositoryConnectorUi connectorUi = TasksUi + .getRepositoryConnectorUi(event.getTaskData().getConnectorKind()); + if (!connectorUi.hasCustomNotifications()) { + TaskListNotification notification = getNotification(event.getTask(), event.getToken()); + if (notification != null) { + synchronized (notificationQueue) { + if (enabled) { + notificationQueue.add(notification); + } } } } @@ -111,6 +116,24 @@ public class TaskListNotifier implements ITaskDataManagerListener, ITaskListNoti } } + private void recordNotificationText(TaskDataManagerEvent event) { + ITask task = event.getTask(); + SynchronizationState state = task.getSynchronizationState(); + String notificationText = null; + if (state.isIncoming()) { + notificationText = computeNotificationText(task); + } + task.setAttribute(KEY_INCOMING_NOTIFICATION_TEXT, notificationText); + } + + public String computeNotificationText(ITask task) { + TaskDataDiff diff = getDiff(task); + if (diff != null && diff.hasChanged()) { + return TaskDiffUtil.toString(diff, true); + } + return null; + } + public Set<AbstractUiNotification> getNotifications() { synchronized (notificationQueue) { if (notificationQueue.isEmpty()) { @@ -122,8 +145,9 @@ public class TaskListNotifier implements ITaskDataManagerListener, ITaskListNoti } } + @Override public void editsDiscarded(TaskDataManagerEvent event) { - // ignore + // ignore } public void setEnabled(boolean enabled) { diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java index cbc78d879..be1cecf01 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java @@ -23,6 +23,7 @@ import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.action.LegacyActionTools; import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.mylyn.commons.core.DateUtil; import org.eclipse.mylyn.commons.ui.CommonImages; import org.eclipse.mylyn.commons.ui.GradientToolTip; @@ -38,12 +39,10 @@ import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer; import org.eclipse.mylyn.internal.tasks.core.TaskCategory; import org.eclipse.mylyn.internal.tasks.core.UncategorizedTaskContainer; import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer; -import org.eclipse.mylyn.internal.tasks.core.data.TaskDataDiff; import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter; import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; import org.eclipse.mylyn.internal.tasks.ui.TaskScalingHyperlink; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; -import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDiffUtil; import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotifier; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.internal.tasks.ui.views.TaskScheduleContentProvider.StateTaskContainer; @@ -81,6 +80,7 @@ import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.forms.IFormColors; +import com.google.common.base.Strings; import com.ibm.icu.text.DateFormat; import com.ibm.icu.text.SimpleDateFormat; @@ -92,7 +92,11 @@ import com.ibm.icu.text.SimpleDateFormat; */ public class TaskListToolTip extends GradientToolTip { - private final static int MAX_TEXT_WIDTH = 300; + public static interface TaskListToolTipListener { + + void toolTipHidden(Event event); + + } private final static int MAX_WIDTH = 600; @@ -287,7 +291,7 @@ public class TaskListToolTip extends GradientToolTip { } private String getActivityText(IRepositoryElement element) { - if (element instanceof ITask) { + if (element instanceof AbstractTask) { AbstractTask task = (AbstractTask) element; StringBuilder sb = new StringBuilder(); @@ -295,8 +299,7 @@ public class TaskListToolTip extends GradientToolTip { Date dueDate = task.getDueDate(); if (dueDate != null) { sb.append(NLS.bind(Messages.TaskListToolTip_Due, - new Object[] { - new SimpleDateFormat("E").format(dueDate), //$NON-NLS-1$ + new Object[] { new SimpleDateFormat("E").format(dueDate), //$NON-NLS-1$ DateFormat.getDateInstance(DateFormat.LONG).format(dueDate), DateFormat.getTimeInstance(DateFormat.SHORT).format(dueDate) })); sb.append("\n"); //$NON-NLS-1$ @@ -308,29 +311,37 @@ public class TaskListToolTip extends GradientToolTip { sb.append("\n"); //$NON-NLS-1$ } long elapsed = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task); - appendEstimateAndActive(sb, (task).getEstimatedTimeHours(), elapsed); + appendEstimateAndActive(sb, task.getEstimatedTimeHours(), elapsed); return sb.toString(); } return null; } - private String getIncommingText(IRepositoryElement element) { + private String getIncomingText(IRepositoryElement element) { + String text = null; if (element instanceof ITask) { ITask task = (ITask) element; if (task.getSynchronizationState().isIncoming()) { - String text = null; - TaskListNotifier notifier = new TaskListNotifier(TasksUiPlugin.getTaskDataManager(), - TasksUiPlugin.getDefault().getSynchronizationManger()); - TaskDataDiff diff = notifier.getDiff(task); - if (diff != null && diff.hasChanged()) { - text = TaskDiffUtil.toString(diff, MAX_TEXT_WIDTH, true); - } - if (text != null && text.length() > 0) { - return text; + task.getAttribute(TaskListNotifier.KEY_INCOMING_NOTIFICATION_TEXT); + if (Strings.isNullOrEmpty(text)) { + TaskListNotifier notifier = new TaskListNotifier(TasksUiPlugin.getTaskDataManager(), + TasksUiPlugin.getDefault().getSynchronizationManger()); + text = notifier.computeNotificationText(task); } } } - return null; + return text; + } + + private ImageDescriptor getIncomingImage() { + ImageDescriptor incomingImage = CommonImages.OVERLAY_SYNC_INCOMMING; + if (currentTipElement instanceof ITask) { + ITask task = (ITask) currentTipElement; + if (task.getSynchronizationState() == SynchronizationState.INCOMING_NEW) { + incomingImage = CommonImages.OVERLAY_SYNC_INCOMMING_NEW; + } + } + return incomingImage; } private String getSynchronizationStateText(IRepositoryElement element) { @@ -390,7 +401,7 @@ public class TaskListToolTip extends GradientToolTip { return control.toDisplay(bounds.x + X_SHIFT, bounds.y + bounds.height + Y_SHIFT); } } - return super.getLocation(tipSize, event);//control.toDisplay(event.x + xShift, event.y + yShift); + return super.getLocation(tipSize, event); } private ProgressData getProgressData(IRepositoryElement element) { @@ -540,18 +551,10 @@ public class TaskListToolTip extends GradientToolTip { addIconAndLabel(composite, CommonImages.getImage(CommonImages.CALENDAR), activityText); } - String incommingText = getIncommingText(currentTipElement); - if (incommingText != null) { - Image image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING); - if (currentTipElement instanceof ITask) { - ITask task = (ITask) currentTipElement; - if (task.getSynchronizationState() == SynchronizationState.INCOMING_NEW) { - image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING_NEW); - } else if (task.getSynchronizationState() == SynchronizationState.OUTGOING_NEW) { - image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_OUTGOING_NEW); - } - } - addIconAndLabel(composite, image, incommingText); + String incomingText = getIncomingText(currentTipElement); + if (incomingText != null) { + ImageDescriptor incomingImage = getIncomingImage(); + addIconAndLabel(composite, CommonImages.getImage(incomingImage), incomingText); } String synchronizationStateText = getSynchronizationStateText(currentTipElement); @@ -563,7 +566,7 @@ public class TaskListToolTip extends GradientToolTip { if (progress != null) { addIconAndLabel(composite, null, progress.text); - // label height need to be set to 0 to remove gap below the progress bar + // label height need to be set to 0 to remove gap below the progress bar Label label = new Label(composite, SWT.NONE); GridData labelGridData = new GridData(SWT.FILL, SWT.TOP, true, false); labelGridData.heightHint = 0; @@ -613,11 +616,11 @@ public class TaskListToolTip extends GradientToolTip { TaskListView taskListView = TaskListView.getFromActivePerspective(); if (taskListView != null) { - if (!taskListView.isFocusedMode() - && TasksUiPlugin.getDefault() - .getPreferenceStore() - .getBoolean(ITasksUiPreferenceConstants.FILTER_COMPLETE_MODE)) { - Object[] children = ((TaskListContentProvider) taskListView.getViewer().getContentProvider()).getChildren(element); + if (!taskListView.isFocusedMode() && TasksUiPlugin.getDefault() + .getPreferenceStore() + .getBoolean(ITasksUiPreferenceConstants.FILTER_COMPLETE_MODE)) { + Object[] children = ((TaskListContentProvider) taskListView.getViewer().getContentProvider()) + .getChildren(element); boolean hasIncoming = false; for (Object child : children) { if (child instanceof ITask) { @@ -711,12 +714,6 @@ public class TaskListToolTip extends GradientToolTip { } - public static interface TaskListToolTipListener { - - void toolTipHidden(Event event); - - } - public boolean isVisible() { return visible; } |