View | Details | Raw Unified | Return to bug 263528 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java (+4 lines)
Lines 87-90 Link Here
87
	public static final String PREF_DATA_DIR = "org.eclipse.mylyn.data.dir"; //$NON-NLS-1$
87
	public static final String PREF_DATA_DIR = "org.eclipse.mylyn.data.dir"; //$NON-NLS-1$
88
88
89
	public static final String DEFAULT_ATTACHMENTS_DIRECTORY = "org.eclipse.mylyn.tasks.ui.attachments.defaultDirectory"; //$NON-NLS-1$
89
	public static final String DEFAULT_ATTACHMENTS_DIRECTORY = "org.eclipse.mylyn.tasks.ui.attachments.defaultDirectory"; //$NON-NLS-1$
90
91
	public static final String SERVICE_MESSAGE_URL = "org.eclipse.mylyn.tasks.ui.servicemessage.url"; //$NON-NLS-1$;
92
93
	public static final String LAST_SERVICE_MESSAGE_ID = "org.eclipse.mylyn.tasks.ui.servicemessage.id";
90
}
94
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java (+14 lines)
Lines 77-82 Link Here
77
import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationParticipant;
77
import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationParticipant;
78
import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant;
78
import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant;
79
import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer;
79
import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer;
80
import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageManager;
80
import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationReminder;
81
import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationReminder;
81
import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotifier;
82
import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotifier;
82
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader;
83
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader;
Lines 149-154 Link Here
149
150
150
	private RepositoryTemplateManager repositoryTemplateManager;
151
	private RepositoryTemplateManager repositoryTemplateManager;
151
152
153
	private ServiceMessageManager serviceMessageManager;
154
152
	private final Set<AbstractTaskEditorPageFactory> taskEditorPageFactories = new HashSet<AbstractTaskEditorPageFactory>();
155
	private final Set<AbstractTaskEditorPageFactory> taskEditorPageFactories = new HashSet<AbstractTaskEditorPageFactory>();
153
156
154
	private final TreeSet<AbstractTaskRepositoryLinkProvider> repositoryLinkProviders = new TreeSet<AbstractTaskRepositoryLinkProvider>(
157
	private final TreeSet<AbstractTaskRepositoryLinkProvider> repositoryLinkProviders = new TreeSet<AbstractTaskRepositoryLinkProvider>(
Lines 605-610 Link Here
605
			// make this available early for clients that are not initialized through tasks ui but need access 
608
			// make this available early for clients that are not initialized through tasks ui but need access 
606
			taskListNotificationManager = new TaskListNotificationManager();
609
			taskListNotificationManager = new TaskListNotificationManager();
607
610
611
			serviceMessageManager = new ServiceMessageManager(getPreferenceStore().getString(
612
					ITasksUiPreferenceConstants.SERVICE_MESSAGE_URL));
613
			serviceMessageManager.start();
614
608
			// trigger lazy initialization
615
			// trigger lazy initialization
609
			new TasksUiInitializationJob().schedule();
616
			new TasksUiInitializationJob().schedule();
610
		} catch (Exception e) {
617
		} catch (Exception e) {
Lines 727-732 Link Here
727
//					ContextCorePlugin.getDefault().getPluginPreferences().removePropertyChangeListener(
734
//					ContextCorePlugin.getDefault().getPluginPreferences().removePropertyChangeListener(
728
//							PREFERENCE_LISTENER);
735
//							PREFERENCE_LISTENER);
729
//				}
736
//				}
737
				serviceMessageManager.stop();
730
				taskEditorBloatManager.dispose(PlatformUI.getWorkbench());
738
				taskEditorBloatManager.dispose(PlatformUI.getWorkbench());
731
				INSTANCE = null;
739
				INSTANCE = null;
732
			}
740
			}
Lines 894-899 Link Here
894
902
895
		store.setDefault(ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST, true);
903
		store.setDefault(ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST, true);
896
		store.setDefault(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED, true);
904
		store.setDefault(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED, true);
905
906
		store.setDefault(ITasksUiPreferenceConstants.SERVICE_MESSAGE_URL, "http://eclipse.org/mylyn/message.xml"); //$NON-NLS-1$
897
	}
907
	}
898
908
899
	public static TaskActivityManager getTaskActivityManager() {
909
	public static TaskActivityManager getTaskActivityManager() {
Lines 1306-1309 Link Here
1306
		}
1316
		}
1307
	}
1317
	}
1308
1318
1319
	public ServiceMessageManager getServiceMessageManager() {
1320
		return serviceMessageManager;
1321
	}
1322
1309
}
1323
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java (-1 / +22 lines)
Lines 86-91 Link Here
86
import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListSortAction;
86
import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListSortAction;
87
import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListViewActionGroup;
87
import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListViewActionGroup;
88
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskListChangeAdapter;
88
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskListChangeAdapter;
89
import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListServiceMessageControl;
89
import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil;
90
import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil;
90
import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion;
91
import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion;
91
import org.eclipse.mylyn.internal.tasks.ui.util.TaskDragSourceListener;
92
import org.eclipse.mylyn.internal.tasks.ui.util.TaskDragSourceListener;
Lines 131-136 Link Here
131
import org.eclipse.swt.graphics.Image;
132
import org.eclipse.swt.graphics.Image;
132
import org.eclipse.swt.graphics.Point;
133
import org.eclipse.swt.graphics.Point;
133
import org.eclipse.swt.graphics.Rectangle;
134
import org.eclipse.swt.graphics.Rectangle;
135
import org.eclipse.swt.layout.GridLayout;
134
import org.eclipse.swt.widgets.Composite;
136
import org.eclipse.swt.widgets.Composite;
135
import org.eclipse.swt.widgets.Menu;
137
import org.eclipse.swt.widgets.Menu;
136
import org.eclipse.swt.widgets.Text;
138
import org.eclipse.swt.widgets.Text;
Lines 390-395 Link Here
390
392
391
	private CustomTaskListDecorationDrawer customDrawer;
393
	private CustomTaskListDecorationDrawer customDrawer;
392
394
395
	private TaskListServiceMessageControl serviceMessageControl;
396
393
	private final IPageListener PAGE_LISTENER = new IPageListener() {
397
	private final IPageListener PAGE_LISTENER = new IPageListener() {
394
		public void pageActivated(IWorkbenchPage page) {
398
		public void pageActivated(IWorkbenchPage page) {
395
			filteredTree.indicateActiveTaskWorkingSet();
399
			filteredTree.indicateActiveTaskWorkingSet();
Lines 730-735 Link Here
730
734
731
	@Override
735
	@Override
732
	public void createPartControl(Composite parent) {
736
	public void createPartControl(Composite parent) {
737
738
		Composite body = new Composite(parent, SWT.NONE);
739
		GridLayout layout = new GridLayout(1, false);
740
		layout.marginHeight = 0;
741
		layout.marginWidth = 0;
742
		layout.horizontalSpacing = 0;
743
		layout.verticalSpacing = 0;
744
		layout.numColumns = 1;
745
		body.setLayout(layout);
746
733
		IWorkbenchSiteProgressService progress = (IWorkbenchSiteProgressService) getSite().getAdapter(
747
		IWorkbenchSiteProgressService progress = (IWorkbenchSiteProgressService) getSite().getAdapter(
734
				IWorkbenchSiteProgressService.class);
748
				IWorkbenchSiteProgressService.class);
735
		if (progress != null) {
749
		if (progress != null) {
Lines 743-749 Link Here
743
		themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
757
		themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
744
		themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER);
758
		themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER);
745
759
746
		filteredTree = new TaskListFilteredTree(parent, SWT.MULTI | SWT.VERTICAL | /* SWT.H_SCROLL | */SWT.V_SCROLL
760
		filteredTree = new TaskListFilteredTree(body, SWT.MULTI | SWT.VERTICAL | /* SWT.H_SCROLL | */SWT.V_SCROLL
747
				| SWT.NO_SCROLL | SWT.FULL_SELECTION, new SubstringPatternFilter(), getViewSite().getWorkbenchWindow());
761
				| SWT.NO_SCROLL | SWT.FULL_SELECTION, new SubstringPatternFilter(), getViewSite().getWorkbenchWindow());
748
762
749
		// need to do initialize tooltip early for native tooltip disablement to take effect
763
		// need to do initialize tooltip early for native tooltip disablement to take effect
Lines 922-927 Link Here
922
		TasksUiInternal.getTaskList().addChangeListener(TASKLIST_CHANGE_LISTENER);
936
		TasksUiInternal.getTaskList().addChangeListener(TASKLIST_CHANGE_LISTENER);
923
937
924
		TasksUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(tasksUiPreferenceListener);
938
		TasksUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(tasksUiPreferenceListener);
939
		serviceMessageControl = new TaskListServiceMessageControl(body);
940
		serviceMessageControl.setServiceMessage(TasksUiPlugin.getDefault()
941
				.getServiceMessageManager()
942
				.getServiceMessage());
943
		TasksUiPlugin.getDefault().getServiceMessageManager().addServiceMessageListener(serviceMessageControl);
925
944
926
		// Need to do this because the page, which holds the active working set is not around on creation, see bug 203179
945
		// Need to do this because the page, which holds the active working set is not around on creation, see bug 203179
927
		PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPageListener(PAGE_LISTENER);
946
		PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPageListener(PAGE_LISTENER);
Lines 1263-1268 Link Here
1263
	}
1282
	}
1264
1283
1265
	public void goIntoCategory() {
1284
	public void goIntoCategory() {
1285
		serviceMessageControl.setHidden(true);
1266
		ISelection selection = getViewer().getSelection();
1286
		ISelection selection = getViewer().getSelection();
1267
		if (selection instanceof StructuredSelection) {
1287
		if (selection instanceof StructuredSelection) {
1268
			StructuredSelection structuredSelection = (StructuredSelection) selection;
1288
			StructuredSelection structuredSelection = (StructuredSelection) selection;
Lines 1280-1285 Link Here
1280
	}
1300
	}
1281
1301
1282
	public void goUpToRoot() {
1302
	public void goUpToRoot() {
1303
		serviceMessageControl.setHidden(false);
1283
		drilledIntoCategory = null;
1304
		drilledIntoCategory = null;
1284
		drillDownAdapter.goBack();
1305
		drillDownAdapter.goBack();
1285
		IActionBars bars = getViewSite().getActionBars();
1306
		IActionBars bars = getViewSite().getActionBars();
(-)src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java (+207 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.ui.notifications;
13
14
import org.eclipse.jface.dialogs.Dialog;
15
import org.eclipse.jface.layout.GridDataFactory;
16
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
17
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
18
import org.eclipse.mylyn.internal.provisional.commons.ui.GradientCanvas;
19
import org.eclipse.mylyn.internal.tasks.core.servicemessage.IServiceMessageListener;
20
import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessage;
21
import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
22
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
23
import org.eclipse.swt.SWT;
24
import org.eclipse.swt.events.DisposeEvent;
25
import org.eclipse.swt.events.DisposeListener;
26
import org.eclipse.swt.graphics.Color;
27
import org.eclipse.swt.graphics.Font;
28
import org.eclipse.swt.graphics.FontData;
29
import org.eclipse.swt.graphics.Image;
30
import org.eclipse.swt.layout.GridData;
31
import org.eclipse.swt.layout.GridLayout;
32
import org.eclipse.swt.widgets.Composite;
33
import org.eclipse.swt.widgets.Control;
34
import org.eclipse.swt.widgets.Display;
35
import org.eclipse.swt.widgets.Label;
36
import org.eclipse.ui.PlatformUI;
37
import org.eclipse.ui.forms.FormColors;
38
import org.eclipse.ui.forms.IFormColors;
39
import org.eclipse.ui.forms.events.HyperlinkAdapter;
40
import org.eclipse.ui.forms.events.HyperlinkEvent;
41
import org.eclipse.ui.forms.events.IHyperlinkListener;
42
import org.eclipse.ui.forms.widgets.Hyperlink;
43
import org.eclipse.ui.forms.widgets.ImageHyperlink;
44
45
/**
46
 * @author Robert Elves
47
 */
48
public class TaskListServiceMessageControl implements IServiceMessageListener {
49
50
	private ImageHyperlink imageHyperlink;
51
52
	private Hyperlink titleHyperlink;
53
54
	private Label descriptionLabel;
55
56
	private GridData headData;
57
58
	private final Composite parent;
59
60
	private GradientCanvas head;
61
62
	private ImageHyperlink closeLink;
63
64
	private ServiceMessage currentMessage;
65
66
	private boolean constructed;
67
68
	public TaskListServiceMessageControl(Composite parent) {
69
		this.parent = parent;
70
		createControl(parent);
71
	}
72
73
	private void setTitleImage(Image image) {
74
		imageHyperlink.setImage(image);
75
	}
76
77
	private void setTitle(String title) {
78
		titleHyperlink.setText(title);
79
	}
80
81
	private void setDescription(String description) {
82
		descriptionLabel.setText(description);
83
	}
84
85
	private void addHyperlinkListener(IHyperlinkListener listener) {
86
		titleHyperlink.addHyperlinkListener(listener);
87
		imageHyperlink.addHyperlinkListener(listener);
88
	}
89
90
	public Control createControl(Composite parent) {
91
		FormColors colors = new FormColors(parent.getDisplay());
92
		head = new GradientCanvas(parent, SWT.NONE);
93
		GridLayout headLayout = new GridLayout();
94
		headLayout.marginHeight = 0;
95
		headLayout.marginWidth = 0;
96
		headLayout.horizontalSpacing = 0;
97
		headLayout.verticalSpacing = 0;
98
		headLayout.numColumns = 1;
99
		head.setLayout(headLayout);
100
		headData = new GridData(SWT.FILL, SWT.TOP, true, false);
101
		head.setLayoutData(headData);
102
		setHidden(true);
103
104
		Color top = colors.getColor(IFormColors.H_GRADIENT_END);
105
		Color bot = colors.getColor(IFormColors.H_GRADIENT_START);
106
		head.setBackgroundGradient(new Color[] { bot, top }, new int[] { 100 }, true);
107
		head.setSeparatorVisible(true);
108
		head.setSeparatorAlignment(SWT.TOP);
109
110
		head.putColor(IFormColors.H_BOTTOM_KEYLINE1, colors.getColor(IFormColors.H_BOTTOM_KEYLINE1));
111
		head.putColor(IFormColors.H_BOTTOM_KEYLINE2, colors.getColor(IFormColors.H_BOTTOM_KEYLINE2));
112
		head.putColor(IFormColors.H_HOVER_LIGHT, colors.getColor(IFormColors.H_HOVER_LIGHT));
113
		head.putColor(IFormColors.H_HOVER_FULL, colors.getColor(IFormColors.H_HOVER_FULL));
114
		head.putColor(IFormColors.TB_TOGGLE, colors.getColor(IFormColors.TB_TOGGLE));
115
		head.putColor(IFormColors.TB_TOGGLE_HOVER, colors.getColor(IFormColors.TB_TOGGLE_HOVER));
116
117
		Composite informationComp = new Composite(head, SWT.NONE);
118
		informationComp.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));//new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL));
119
		informationComp.setLayout(new GridLayout(3, false));
120
121
		imageHyperlink = new ImageHyperlink(informationComp, SWT.NONE);
122
123
		titleHyperlink = new Hyperlink(informationComp, SWT.WRAP);
124
		setHeaderFontSizeAndStyle(titleHyperlink);
125
126
		closeLink = new ImageHyperlink(informationComp, SWT.NONE);
127
		closeLink.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE));
128
		GridDataFactory.fillDefaults().align(SWT.END, SWT.BEGINNING).applyTo(closeLink);
129
		closeLink.addHyperlinkListener(new HyperlinkAdapter() {
130
			@Override
131
			public void linkActivated(HyperlinkEvent e) {
132
				closeMessage();
133
134
			}
135
136
		});
137
138
		new Label(informationComp, SWT.NONE);
139
140
		descriptionLabel = new Label(informationComp, SWT.WRAP);
141
		GridDataFactory.swtDefaults().span(2, 1).applyTo(descriptionLabel);
142
		constructed = true;
143
		return head;
144
	}
145
146
	private void closeMessage() {
147
		if (currentMessage != null) {
148
			setHidden(true);
149
			TasksUiPlugin.getDefault().getPreferenceStore().setValue(
150
					ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_ID, currentMessage.getId());
151
		}
152
	}
153
154
	public void setHidden(boolean hidden) {
155
		headData.exclude = hidden;
156
		if (constructed) {
157
			parent.layout(true);
158
		}
159
	}
160
161
	// From EditorUtil
162
	private static Font setHeaderFontSizeAndStyle(Control text) {
163
		float sizeFactor = 1.2f;
164
		Font initialFont = text.getFont();
165
		FontData[] fontData = initialFont.getFontData();
166
		for (FontData element : fontData) {
167
			element.setHeight((int) (element.getHeight() * sizeFactor));
168
			element.setStyle(element.getStyle() | SWT.BOLD);
169
		}
170
		final Font textFont = new Font(text.getDisplay(), fontData);
171
		text.setFont(textFont);
172
		text.addDisposeListener(new DisposeListener() {
173
			public void widgetDisposed(DisposeEvent e) {
174
				textFont.dispose();
175
			}
176
		});
177
		Color color = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry().get(
178
				CommonThemes.COLOR_COMPLETED);
179
		text.setForeground(color);
180
		return textFont;
181
	}
182
183
	public void setServiceMessage(final ServiceMessage message) {
184
		if (message != null) {
185
			String lastMessageId = TasksUiPlugin.getDefault().getPreferenceStore().getString(
186
					ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_ID);
187
			if (!lastMessageId.equals(message.getId())) {
188
				currentMessage = message;
189
				Display.getDefault().asyncExec(new Runnable() {
190
191
					public void run() {
192
						if (message != null) {
193
							setTitle(message.getTitle());
194
							setDescription(message.getDescription());
195
							setTitleImage(Dialog.getImage(message.getImage()));
196
							setHidden(false);
197
						} else {
198
							setHidden(true);
199
						}
200
201
					}
202
				});
203
			}
204
		}
205
	}
206
207
}
(-)META-INF/MANIFEST.MF (+1 lines)
Lines 14-19 Link Here
14
 org.eclipse.mylyn.internal.tasks.core;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
14
 org.eclipse.mylyn.internal.tasks.core;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
15
 org.eclipse.mylyn.internal.tasks.core.data;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
15
 org.eclipse.mylyn.internal.tasks.core.data;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
16
 org.eclipse.mylyn.internal.tasks.core.externalization;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
16
 org.eclipse.mylyn.internal.tasks.core.externalization;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
17
 org.eclipse.mylyn.internal.tasks.core.servicemessage,
17
 org.eclipse.mylyn.internal.tasks.core.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
18
 org.eclipse.mylyn.internal.tasks.core.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
18
 org.eclipse.mylyn.tasks.core,
19
 org.eclipse.mylyn.tasks.core,
19
 org.eclipse.mylyn.tasks.core.data,
20
 org.eclipse.mylyn.tasks.core.data,
(-)src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java (+70 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.core.servicemessage;
13
14
import org.xml.sax.Attributes;
15
import org.xml.sax.SAXException;
16
import org.xml.sax.helpers.DefaultHandler;
17
18
public class ServiceMessageXmlHandler extends DefaultHandler {
19
20
	private StringBuilder characters;
21
22
	private final ServiceMessage message = new ServiceMessage();
23
24
	@Override
25
	public void characters(char[] ch, int start, int length) throws SAXException {
26
		characters.append(ch, start, length);
27
	}
28
29
	@Override
30
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
31
		characters = new StringBuilder();
32
	}
33
34
	@Override
35
	public void endElement(String uri, String localName, String qName) throws SAXException {
36
37
		String parsedText = characters.toString();
38
		ServiceMessage.Element element;
39
		try {
40
			element = ServiceMessage.Element.valueOf(qName.trim());
41
			switch (element) {
42
			case id:
43
				message.id = parsedText;
44
				break;
45
			case description:
46
				message.description = parsedText;
47
				break;
48
			case title:
49
				message.title = parsedText;
50
				break;
51
			case url:
52
				message.url = parsedText;
53
				break;
54
			case image:
55
				message.image = parsedText;
56
				break;
57
			}
58
		} catch (RuntimeException e) {
59
			if (e instanceof IllegalArgumentException) {
60
				// ignore unrecognized elements
61
				return;
62
			}
63
			throw e;
64
		}
65
	}
66
67
	public ServiceMessage getMessage() {
68
		return message;
69
	}
70
}
(-)src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java (+172 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2008 Tasktop Technologies.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Tasktop EULA
5
 * which accompanies this distribution, and is available at
6
 * http://tasktop.com/legal
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.tasks.core.servicemessage;
10
11
import java.io.InputStream;
12
import java.util.HashSet;
13
import java.util.Set;
14
15
import javax.xml.parsers.SAXParser;
16
import javax.xml.parsers.SAXParserFactory;
17
18
import org.apache.commons.httpclient.HostConfiguration;
19
import org.apache.commons.httpclient.HttpClient;
20
import org.apache.commons.httpclient.HttpStatus;
21
import org.apache.commons.httpclient.methods.GetMethod;
22
import org.eclipse.core.runtime.IProgressMonitor;
23
import org.eclipse.core.runtime.IStatus;
24
import org.eclipse.core.runtime.Status;
25
import org.eclipse.core.runtime.SubProgressMonitor;
26
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
27
import org.eclipse.core.runtime.jobs.Job;
28
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
29
import org.eclipse.mylyn.commons.core.StatusHandler;
30
import org.eclipse.mylyn.commons.net.AbstractWebLocation;
31
import org.eclipse.mylyn.commons.net.WebLocation;
32
import org.eclipse.mylyn.commons.net.WebUtil;
33
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
34
35
// Todo: use Last-Modified and ETag headers
36
public class ServiceMessageManager {
37
38
	protected static final long START_DELAY = 30 * 1000;
39
40
	protected static final long RECHECK_DELAY = 2 * 60 * 60 * 1000;
41
42
	private static final String USER_AGENT = "MylynServiceMessageManager"; //$NON-NLS-1$
43
44
//	private static final String URL = "http://tasktop.com/support/messages/dashboardMessage.php";
45
	private String serviceMessageUrl;
46
47
	private ServiceMessage currentMessage = null;
48
49
	private Job messageCheckJob;
50
51
	private final Set<IServiceMessageListener> listeners = new HashSet<IServiceMessageListener>();
52
53
	private final HttpClient httpClient = new HttpClient(WebUtil.getConnectionManager());
54
55
	public ServiceMessageManager(String serviceMessageUrl) {
56
57
		this.serviceMessageUrl = serviceMessageUrl;
58
59
		WebUtil.configureHttpClient(httpClient, USER_AGENT);
60
61
	}
62
63
	public void start() {
64
		if (messageCheckJob == null) {
65
			messageCheckJob = new Job("Checking for new Service Message") { //$NON-NLS-1$
66
				@Override
67
				protected IStatus run(IProgressMonitor monitor) {
68
69
					updateServiceMessage(monitor);
70
71
					return Status.OK_STATUS;
72
				}
73
74
			};
75
			messageCheckJob.setSystem(true);
76
			messageCheckJob.addJobChangeListener(new JobChangeAdapter() {
77
				@Override
78
				public void done(IJobChangeEvent event) {
79
					if (messageCheckJob != null) {
80
						messageCheckJob.schedule(RECHECK_DELAY);
81
					}
82
				}
83
			});
84
		}
85
		messageCheckJob.schedule(START_DELAY);
86
	}
87
88
	public void stop() {
89
		if (messageCheckJob != null) {
90
			messageCheckJob.cancel();
91
			messageCheckJob = null;
92
		}
93
	}
94
95
	public void setServiceMessageUrl(String url) {
96
		this.serviceMessageUrl = url;
97
	}
98
99
	public void addServiceMessageListener(IServiceMessageListener listener) {
100
		listeners.add(listener);
101
	}
102
103
	public void removeServiceMessageListener(IServiceMessageListener listener) {
104
		listeners.remove(listener);
105
	}
106
107
	private void notifyListeners(ServiceMessage message) {
108
		for (IServiceMessageListener listener : listeners) {
109
			listener.setServiceMessage(message);
110
		}
111
	}
112
113
	public ServiceMessage getServiceMessage() {
114
		return currentMessage;
115
	}
116
117
	/**
118
	 * Public for testing
119
	 */
120
	public void updateServiceMessage(IProgressMonitor monitor) {
121
		GetMethod getMethod = null;
122
		try {
123
124
			HostConfiguration hostConfiguration = null;
125
			AbstractWebLocation location = null;
126
127
			location = new WebLocation(serviceMessageUrl);
128
			hostConfiguration = WebUtil.createHostConfiguration(httpClient, location,
129
					new SubProgressMonitor(monitor, 1));
130
131
			getMethod = new GetMethod(serviceMessageUrl);
132
133
			httpClient.getHttpConnectionManager().getParams().setSoTimeout(WebUtil.getConnectionTimeout());
134
135
			int status = WebUtil.execute(httpClient, hostConfiguration, getMethod, monitor);
136
137
			if (status == HttpStatus.SC_OK) {
138
				InputStream in = WebUtil.getResponseBodyAsStream(getMethod, monitor);
139
				ServiceMessageXmlHandler handler = new ServiceMessageXmlHandler();
140
				try {
141
					SAXParserFactory factory = SAXParserFactory.newInstance();
142
					factory.setValidating(false);
143
					SAXParser parser = factory.newSAXParser();
144
					parser.parse(in, handler);
145
				} finally {
146
					in.close();
147
				}
148
149
				ServiceMessage message = handler.getMessage();
150
				if (message.id != null) {
151
					currentMessage = message;
152
					notifyListeners(message);
153
				}
154
155
			} else {
156
				StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
157
						"Http error retrieving service message: " + HttpStatus.getStatusText(status))); //$NON-NLS-1$
158
			}
159
		} catch (Exception e) {
160
			StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
161
					"Http error retrieving service message.", e)); //$NON-NLS-1$
162
		} finally {
163
			try {
164
				if (getMethod != null) {
165
					getMethod.releaseConnection();
166
				}
167
			} catch (Throwable t) {
168
				// ignore
169
			}
170
		}
171
	}
172
}
(-)src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java (+18 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.core.servicemessage;
13
14
public interface IServiceMessageListener {
15
16
	public void setServiceMessage(ServiceMessage message);
17
18
}
(-)src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java (+50 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.core.servicemessage;
13
14
public class ServiceMessage {
15
16
	public enum Element {
17
		id, title, description, url, image
18
	};
19
20
	String id;
21
22
	String title;
23
24
	String description;
25
26
	String url;
27
28
	String image;
29
30
	public String getId() {
31
		return id;
32
	}
33
34
	public String getTitle() {
35
		return title;
36
	}
37
38
	public String getDescription() {
39
		return description;
40
	}
41
42
	public String getUrl() {
43
		return url;
44
	}
45
46
	public String getImage() {
47
		return image;
48
	}
49
50
}
(-)src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java (+2 lines)
Lines 30-35 Link Here
30
import org.eclipse.mylyn.tasks.tests.ui.editor.RepositoryCompletionProcessorTest;
30
import org.eclipse.mylyn.tasks.tests.ui.editor.RepositoryCompletionProcessorTest;
31
import org.eclipse.mylyn.tasks.tests.ui.editor.TaskEditorPartDescriptorTest;
31
import org.eclipse.mylyn.tasks.tests.ui.editor.TaskEditorPartDescriptorTest;
32
import org.eclipse.mylyn.tasks.tests.ui.editor.TaskUrlHyperlinkDetectorTest;
32
import org.eclipse.mylyn.tasks.tests.ui.editor.TaskUrlHyperlinkDetectorTest;
33
import org.eclipse.mylyn.tasks.tests.util.ServiceMessageManagerTest;
33
34
34
/**
35
/**
35
 * @author Mik Kersten
36
 * @author Mik Kersten
Lines 102-107 Link Here
102
		suite.addTestSuite(PlanningPartTest.class);
103
		suite.addTestSuite(PlanningPartTest.class);
103
		suite.addTestSuite(RepositoryCompletionProcessorTest.class);
104
		suite.addTestSuite(RepositoryCompletionProcessorTest.class);
104
		suite.addTestSuite(TaskAttributeDiffTest.class);
105
		suite.addTestSuite(TaskAttributeDiffTest.class);
106
		suite.addTestSuite(ServiceMessageManagerTest.class);
105
		// XXX long running tests, put back?
107
		// XXX long running tests, put back?
106
		//suite.addTestSuite(QueryExportImportTest.class);
108
		//suite.addTestSuite(QueryExportImportTest.class);
107
		//suite.addTestSuite(BackgroundSaveTest.class);
109
		//suite.addTestSuite(BackgroundSaveTest.class);
(-)src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java (+59 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.tasks.tests.util;
13
14
import java.io.ByteArrayInputStream;
15
import java.io.InputStream;
16
17
import javax.xml.parsers.SAXParser;
18
import javax.xml.parsers.SAXParserFactory;
19
20
import junit.framework.TestCase;
21
22
import org.eclipse.core.runtime.NullProgressMonitor;
23
import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessage;
24
import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageManager;
25
import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageXmlHandler;
26
27
public class ServiceMessageManagerTest extends TestCase {
28
29
	public void testRetrievingMessage() throws Exception {
30
		ServiceMessageManager manager = new ServiceMessageManager("http://eclipse.org/mylyn/messageTest.xml");
31
		manager.updateServiceMessage(new NullProgressMonitor());
32
		ServiceMessage message = manager.getServiceMessage();
33
34
		assertEquals("1", message.getId());
35
		assertEquals("140 character description here....", message.getDescription());
36
		assertEquals("Mylyn 3.4 now available!", message.getTitle());
37
		assertEquals("http://eclipse.org/mylyn/downloads", message.getUrl());
38
		assertEquals("Mylyn 3.4 now available!", message.getTitle());
39
		assertEquals("dialog_messasge_info_image", message.getImage());
40
	}
41
42
	public void testParsingMessageXml() throws Exception {
43
		String messageXml = "<ServiceMessage> <id>1</id><description>140 character description here....</description><title>Mylyn 3.4 now available!</title><url>http://eclipse.org/mylyn/downloads</url><image>dialog_messasge_info_image</image></ServiceMessage>";
44
		InputStream is = new ByteArrayInputStream(messageXml.getBytes("UTF-8"));
45
		SAXParserFactory factory = SAXParserFactory.newInstance();
46
		factory.setValidating(false);
47
		SAXParser parser = factory.newSAXParser();
48
		ServiceMessageXmlHandler handler = new ServiceMessageXmlHandler();
49
		parser.parse(is, handler);
50
		ServiceMessage message = handler.getMessage();
51
52
		assertEquals("1", message.getId());
53
		assertEquals("140 character description here....", message.getDescription());
54
		assertEquals("Mylyn 3.4 now available!", message.getTitle());
55
		assertEquals("http://eclipse.org/mylyn/downloads", message.getUrl());
56
		assertEquals("Mylyn 3.4 now available!", message.getTitle());
57
		assertEquals("dialog_messasge_info_image", message.getImage());
58
	}
59
}

Return to bug 263528