Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaxsun McCarthy Huggan2016-05-25 23:04:46 +0000
committerGerrit Code Review @ Eclipse.org2016-05-27 20:15:26 +0000
commit7ebe840367437541244ec57906d28629c4db9c1d (patch)
tree7364b951c6361f06e5bd245af63ca6cad46da068
parent7d93772224d925b59be2277991856e958bb9a188 (diff)
downloadorg.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>
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDiffUtil.java11
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java64
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java83
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;
}

Back to the top