### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.core Index: META-INF/MANIFEST.MF =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF,v retrieving revision 1.365 diff -u -r1.365 MANIFEST.MF --- META-INF/MANIFEST.MF 11 Apr 2010 19:49:55 -0000 1.365 +++ META-INF/MANIFEST.MF 22 May 2010 21:42:06 -0000 @@ -14,6 +14,7 @@ org.eclipse.mylyn.internal.tasks.core;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.data;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.externalization;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", + org.eclipse.mylyn.internal.tasks.core.servicemessage, org.eclipse.mylyn.internal.tasks.core.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.tasks.core, org.eclipse.mylyn.tasks.core.data, Index: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java diff -N src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageXmlHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies 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: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core.servicemessage; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public class ServiceMessageXmlHandler extends DefaultHandler { + + private StringBuilder characters; + + private final ServiceMessage message = new ServiceMessage(); + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + characters.append(ch, start, length); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + characters = new StringBuilder(); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + + String parsedText = characters.toString(); + ServiceMessage.Element element; + try { + element = ServiceMessage.Element.valueOf(qName.trim()); + switch (element) { + case id: + message.setId(parsedText); + break; + case description: + message.setDescription(parsedText); + break; + case title: + message.setTitle(parsedText); + break; + case url: + message.setUrl(parsedText); + break; + case image: + message.setImage(parsedText); + break; + case mylynVersion: + message.setMylynVersion(parsedText); + break; + } + } catch (RuntimeException e) { + if (e instanceof IllegalArgumentException) { + // ignore unrecognized elements + return; + } + throw e; + } + } + + public ServiceMessage getMessage() { + return message; + } +} Index: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java diff -N src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessageManager.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,208 @@ +/******************************************************************************* + * Copyright (c) 2004, 2008 Tasktop Technologies. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Tasktop EULA + * which accompanies this distribution, and is available at + * http://tasktop.com/legal + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core.servicemessage; + +import java.io.InputStream; +import java.util.HashSet; +import java.util.Set; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HostConfiguration; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.eclipse.mylyn.commons.core.StatusHandler; +import org.eclipse.mylyn.commons.net.AbstractWebLocation; +import org.eclipse.mylyn.commons.net.WebLocation; +import org.eclipse.mylyn.commons.net.WebUtil; +import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; + +// Todo: use Last-Modified and ETag headers +public class ServiceMessageManager { + + protected static final long START_DELAY = 30 * 1000; + + protected static final long RECHECK_DELAY = 2 * 60 * 60 * 1000; + + private static final String USER_AGENT = "MylynServiceMessageManager"; //$NON-NLS-1$ + + private String serviceMessageUrl; + + private ServiceMessage currentMessage = null; + + private Job messageCheckJob; + + private final Set listeners = new HashSet(); + + private final HttpClient httpClient = new HttpClient(WebUtil.getConnectionManager()); + + private String lastModified; + + private String eTag; + + private int status; + + public ServiceMessageManager(String serviceMessageUrl, String lastModified, String eTag) { + + this.serviceMessageUrl = serviceMessageUrl; + + this.lastModified = lastModified; + + this.eTag = eTag; + + WebUtil.configureHttpClient(httpClient, USER_AGENT); + + } + + public void start() { + if (messageCheckJob == null) { + messageCheckJob = new Job("Checking for new service message") { //$NON-NLS-1$ + @Override + protected IStatus run(IProgressMonitor monitor) { + + updateServiceMessage(monitor); + + return Status.OK_STATUS; + } + + }; + messageCheckJob.setSystem(true); + messageCheckJob.setPriority(Job.DECORATE); + messageCheckJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + if (messageCheckJob != null) { + messageCheckJob.schedule(RECHECK_DELAY); + } + } + }); + } + messageCheckJob.schedule(START_DELAY); + } + + public void stop() { + notifyListeners(null); + if (messageCheckJob != null) { + messageCheckJob.cancel(); + messageCheckJob = null; + } + } + + public void setServiceMessageUrl(String url) { + this.serviceMessageUrl = url; + } + + public void addServiceMessageListener(IServiceMessageListener listener) { + listeners.add(listener); + } + + public void removeServiceMessageListener(IServiceMessageListener listener) { + listeners.remove(listener); + } + + private void notifyListeners(ServiceMessage message) { + for (IServiceMessageListener listener : listeners) { + listener.setServiceMessage(message); + } + } + + public ServiceMessage getServiceMessage() { + return currentMessage; + } + + /** + * Public for testing + */ + public void updateServiceMessage(IProgressMonitor monitor) { + GetMethod getMethod = null; + try { + + HostConfiguration hostConfiguration = null; + AbstractWebLocation location = null; + + location = new WebLocation(serviceMessageUrl); + hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, + new SubProgressMonitor(monitor, 1)); + + getMethod = new GetMethod(serviceMessageUrl); + + getMethod.setRequestHeader("If-Modified-Since", lastModified); //$NON-NLS-1$ + getMethod.setRequestHeader("If-None-Match", eTag); //$NON-NLS-1$ + + httpClient.getHttpConnectionManager().getParams().setSoTimeout(WebUtil.getConnectionTimeout()); + + status = WebUtil.execute(httpClient, hostConfiguration, getMethod, monitor); + + if (status == HttpStatus.SC_OK) { + Header lastModifiedHeader = getMethod.getResponseHeader("Last-Modified"); //$NON-NLS-1$ + if (lastModifiedHeader != null) { + lastModified = lastModifiedHeader.getValue(); + } + Header eTagHeader = getMethod.getResponseHeader("ETag"); //$NON-NLS-1$ + if (eTagHeader != null) { + eTag = eTagHeader.getValue(); + } + + InputStream in = WebUtil.getResponseBodyAsStream(getMethod, monitor); + ServiceMessage message; + if (getMethod.getResponseHeader("Content-Length").getValue().equals("0")) { //$NON-NLS-1$ //$NON-NLS-2$ + message = new ServiceMessage(); + message.setId("-1"); //$NON-NLS-1$ + } else { + ServiceMessageXmlHandler handler = new ServiceMessageXmlHandler(); + try { + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setValidating(false); + SAXParser parser = factory.newSAXParser(); + parser.parse(in, handler); + } finally { + in.close(); + } + + message = handler.getMessage(); + } + if (message.getId() != null) { + currentMessage = message; + currentMessage.setETag(eTag); + currentMessage.setLastModified(lastModified); + notifyListeners(message); + } + } else if (status == HttpStatus.SC_NOT_MODIFIED) { + } else { + StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, + "Http error retrieving service message: " + HttpStatus.getStatusText(status))); //$NON-NLS-1$ + } + } catch (Exception e) { + StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, + "Http error retrieving service message.", e)); //$NON-NLS-1$ + } finally { + try { + if (getMethod != null) { + getMethod.releaseConnection(); + } + } catch (Throwable t) { + // ignore + } + } + } + + public int getStatus() { + return status; + } +} Index: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java diff -N src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/servicemessage/IServiceMessageListener.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies 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: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core.servicemessage; + +public interface IServiceMessageListener { + + public void setServiceMessage(ServiceMessage message); + +} Index: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java diff -N src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/servicemessage/ServiceMessage.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies 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: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.core.servicemessage; + +public class ServiceMessage { + + public enum Element { + id, title, description, url, image, mylynVersion + }; + + private String id; + + private String title; + + private String description; + + private String url; + + private String image; + + private String mylynVersion; + + private String eTag; + + private String lastModified; + + public String getId() { + return id; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getUrl() { + return url; + } + + public String getImage() { + return image; + } + + public void setETag(String eTag) { + this.eTag = eTag; + } + + public void setLastModified(String lastModified) { + this.lastModified = lastModified; + } + + public String getETag() { + return eTag; + } + + public String getLastModified() { + return lastModified; + } + + public String getMylynVersion() { + return mylynVersion; + } + + public void setId(String id) { + this.id = id; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setImage(String image) { + this.image = image; + } + + public void setMylynVersion(String mylynVersion) { + this.mylynVersion = mylynVersion; + } + +} #P org.eclipse.mylyn.tasks.tests Index: src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java,v retrieving revision 1.87 diff -u -r1.87 AllTasksTests.java --- src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java 4 Mar 2010 18:41:15 -0000 1.87 +++ src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java 22 May 2010 21:42:06 -0000 @@ -30,6 +30,7 @@ import org.eclipse.mylyn.tasks.tests.ui.editor.RepositoryCompletionProcessorTest; import org.eclipse.mylyn.tasks.tests.ui.editor.TaskEditorPartDescriptorTest; import org.eclipse.mylyn.tasks.tests.ui.editor.TaskUrlHyperlinkDetectorTest; +import org.eclipse.mylyn.tasks.tests.util.ServiceMessageManagerTest; /** * @author Mik Kersten @@ -102,6 +103,7 @@ suite.addTestSuite(PlanningPartTest.class); suite.addTestSuite(RepositoryCompletionProcessorTest.class); suite.addTestSuite(TaskAttributeDiffTest.class); + suite.addTestSuite(ServiceMessageManagerTest.class); // XXX long running tests, put back? //suite.addTestSuite(QueryExportImportTest.class); //suite.addTestSuite(BackgroundSaveTest.class); Index: src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java =================================================================== RCS file: src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java diff -N src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/tasks/tests/util/ServiceMessageManagerTest.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies 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: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.tests.util; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import junit.framework.TestCase; + +import org.apache.commons.httpclient.HttpStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessage; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageManager; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageXmlHandler; +import org.eclipse.mylyn.internal.tasks.ui.notifications.MylynVersion; + +/** + * @author Robert Elves + */ +public class ServiceMessageManagerTest extends TestCase { + + private static final String MESSAGE_XML_URL = "http://eclipse.org/mylyn/messageTest.xml"; + + public void testRetrievingMessage() throws Exception { + ServiceMessageManager manager = new ServiceMessageManager(MESSAGE_XML_URL, "", ""); + manager.updateServiceMessage(new NullProgressMonitor()); + assertEquals(HttpStatus.SC_OK, manager.getStatus()); + ServiceMessage message = manager.getServiceMessage(); + + assertEquals("1", message.getId()); + assertEquals("140 character description here....", message.getDescription()); + assertEquals("Mylyn 3.4 now available!", message.getTitle()); + assertEquals("http://eclipse.org/mylyn/downloads", message.getUrl()); + assertEquals("Mylyn 3.4 now available!", message.getTitle()); + assertEquals("dialog_messasge_info_image", message.getImage()); + } + + public void testETag() throws Exception { + + ServiceMessageManager manager = new ServiceMessageManager(MESSAGE_XML_URL, "", ""); + manager.updateServiceMessage(new NullProgressMonitor()); + assertEquals(HttpStatus.SC_OK, manager.getStatus()); + ServiceMessage message = manager.getServiceMessage(); + + assertNotNull(message.getLastModified()); + assertNotNull(message.getETag()); + + assertEquals(HttpStatus.SC_OK, manager.getStatus()); + + manager.updateServiceMessage(new NullProgressMonitor()); + assertEquals(HttpStatus.SC_NOT_MODIFIED, manager.getStatus()); + } + + public void testParsingMessageXml() throws Exception { + String messageXml = " 1140 character description here....Mylyn 3.4 now available!http://eclipse.org/mylyn/downloadsdialog_messasge_info_image"; + InputStream is = new ByteArrayInputStream(messageXml.getBytes("UTF-8")); + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setValidating(false); + SAXParser parser = factory.newSAXParser(); + ServiceMessageXmlHandler handler = new ServiceMessageXmlHandler(); + parser.parse(is, handler); + ServiceMessage message = handler.getMessage(); + + assertEquals("1", message.getId()); + assertEquals("140 character description here....", message.getDescription()); + assertEquals("Mylyn 3.4 now available!", message.getTitle()); + assertEquals("http://eclipse.org/mylyn/downloads", message.getUrl()); + assertEquals("Mylyn 3.4 now available!", message.getTitle()); + assertEquals("dialog_messasge_info_image", message.getImage()); + } + + public void testMylynVersion() { + MylynVersion v1 = new MylynVersion("3.4.0.I20100521-1600-e3x"); + MylynVersion v2 = new MylynVersion("3.4.0.v20100521-1600-e3x"); + assertTrue(v1.compareTo(v2) < 0); + + MylynVersion v3 = new MylynVersion("3.4.0"); + MylynVersion v4 = new MylynVersion("3.4.0.I20100521-1600-e3x"); + assertTrue(v3.compareTo(v4) < 0); + + v1 = new MylynVersion("3.5.0"); + v2 = new MylynVersion("3.4.0.I20100521-1600-e3x"); + assertTrue(v1.compareTo(v2) > 0); + + v1 = new MylynVersion("3.5.0"); + v2 = new MylynVersion("3.5.0"); + assertTrue(v1.compareTo(v2) == 0); + } +} #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/internal/tasks/ui/preferences/Messages.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/Messages.java,v retrieving revision 1.6 diff -u -r1.6 Messages.java --- src/org/eclipse/mylyn/internal/tasks/ui/preferences/Messages.java 3 Apr 2010 06:10:03 -0000 1.6 +++ src/org/eclipse/mylyn/internal/tasks/ui/preferences/Messages.java 22 May 2010 21:42:07 -0000 @@ -63,6 +63,8 @@ public static String TasksUiPreferencePage_See_X_for_configuring_Task_List_colors; + public static String TasksUiPreferencePage_show_service_messages; + public static String TasksUiPreferencePage_Show_tooltip_on_hover_Label; public static String TasksUiPreferencePage_Specify_the_folder_for_tasks; Index: src/org/eclipse/mylyn/internal/tasks/ui/preferences/TasksUiPreferencePage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/TasksUiPreferencePage.java,v retrieving revision 1.41 diff -u -r1.41 TasksUiPreferencePage.java --- src/org/eclipse/mylyn/internal/tasks/ui/preferences/TasksUiPreferencePage.java 26 Feb 2010 04:07:20 -0000 1.41 +++ src/org/eclipse/mylyn/internal/tasks/ui/preferences/TasksUiPreferencePage.java 22 May 2010 21:42:07 -0000 @@ -23,7 +23,6 @@ import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager; import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin; -import org.eclipse.mylyn.internal.provisional.commons.core.CommonMessages; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors; import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; @@ -109,6 +108,8 @@ private Button taskListTooltipEnabledButton; + private Button taskListServiceMessageEnabledButton; + public TasksUiPreferencePage() { super(); setPreferenceStore(TasksUiPlugin.getDefault().getPreferenceStore()); @@ -208,6 +209,9 @@ getPreferenceStore().setValue(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED, taskListTooltipEnabledButton.getSelection()); + getPreferenceStore().setValue(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED, + taskListServiceMessageEnabledButton.getSelection()); + getPreferenceStore().setValue(ITasksUiPreferenceConstants.WEEK_START_DAY, getWeekStartValue()); //getPreferenceStore().setValue(TasksUiPreferenceConstants.PLANNING_STARTHOUR, hourDayStart.getSelection()); // getPreferenceStore().setValue(TasksUiPreferenceConstants.PLANNING_ENDHOUR, hourDayEnd.getSelection()); @@ -276,6 +280,9 @@ taskListTooltipEnabledButton.setSelection(getPreferenceStore().getBoolean( ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED)); + taskListServiceMessageEnabledButton.setSelection(getPreferenceStore().getBoolean( + ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)); + weekStartCombo.select(getPreferenceStore().getInt(ITasksUiPreferenceConstants.WEEK_START_DAY) - 1); //hourDayStart.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_STARTHOUR)); // hourDayEnd.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR)); @@ -310,6 +317,9 @@ taskListTooltipEnabledButton.setSelection(getPreferenceStore().getDefaultBoolean( ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED)); + taskListServiceMessageEnabledButton.setSelection(getPreferenceStore().getDefaultBoolean( + ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)); + // synchQueries.setSelection(getPreferenceStore().getDefaultBoolean( // TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP)); enableBackgroundSynch.setSelection(getPreferenceStore().getDefaultBoolean( @@ -459,13 +469,13 @@ // weekStartCombo.add(LABEL_SUNDAY); // weekStartCombo.add(LABEL_MONDAY); // weekStartCombo.add(LABEL_SATURDAY); - weekStartCombo.add(CommonMessages.Sunday); - weekStartCombo.add(CommonMessages.Monday); - weekStartCombo.add(CommonMessages.Tuesday); - weekStartCombo.add(CommonMessages.Wednesday); - weekStartCombo.add(CommonMessages.Thursday); - weekStartCombo.add(CommonMessages.Friday); - weekStartCombo.add(CommonMessages.Saturday); + weekStartCombo.add(""); //$NON-NLS-1$ + weekStartCombo.add(""); //$NON-NLS-1$ + weekStartCombo.add(""); //$NON-NLS-1$ + weekStartCombo.add(""); //$NON-NLS-1$ + weekStartCombo.add(""); //$NON-NLS-1$ + weekStartCombo.add(""); //$NON-NLS-1$ + weekStartCombo.add(""); //$NON-NLS-1$ weekStartCombo.select(getPreferenceStore().getInt(ITasksUiPreferenceConstants.WEEK_START_DAY) - 1); } @@ -480,6 +490,11 @@ taskListTooltipEnabledButton.setText(Messages.TasksUiPreferencePage_Show_tooltip_on_hover_Label); taskListTooltipEnabledButton.setSelection(getPreferenceStore().getBoolean( ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED)); + + taskListServiceMessageEnabledButton = new Button(group, SWT.CHECK); + taskListServiceMessageEnabledButton.setText(Messages.TasksUiPreferencePage_show_service_messages); + taskListServiceMessageEnabledButton.setSelection(getPreferenceStore().getBoolean( + ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)); } private void createTaskActivityGroup(Composite container) { Index: src/org/eclipse/mylyn/internal/tasks/ui/preferences/messages.properties =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/messages.properties,v retrieving revision 1.10 diff -u -r1.10 messages.properties --- src/org/eclipse/mylyn/internal/tasks/ui/preferences/messages.properties 3 Apr 2010 06:10:03 -0000 1.10 +++ src/org/eclipse/mylyn/internal/tasks/ui/preferences/messages.properties 22 May 2010 21:42:07 -0000 @@ -27,6 +27,7 @@ TasksUiPreferencePage_Rich_Editor__Recommended_=Rich Editor (Recommended) TasksUiPreferencePage_Scheduling=Scheduling TasksUiPreferencePage_See_X_for_configuring_Task_List_colors=See ''{0}'' for configuring Task List colors. +TasksUiPreferencePage_show_service_messages=Show service messages TasksUiPreferencePage_Show_tooltip_on_hover_Label=Show task overview popups on hover TasksUiPreferencePage_Specify_the_folder_for_tasks=Specify the folder for tasks TasksUiPreferencePage_Stop_time_accumulation_after=Stop time accumulation after Index: src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java,v retrieving revision 1.12 diff -u -r1.12 ITasksUiPreferenceConstants.java --- src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java 15 Jan 2010 02:02:58 -0000 1.12 +++ src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java 22 May 2010 21:42:07 -0000 @@ -52,6 +52,8 @@ public static final String NOTIFICATIONS_ENABLED = "org.eclipse.mylyn.tasks.ui.notifications.enabled"; //$NON-NLS-1$ + public static final String SERVICE_MESSAGES_ENABLED = "org.eclipse.mylyn.tasks.ui.messages.enabled"; //$NON-NLS-1$ + public static final String WEEK_START_DAY = "org.eclipse.mylyn.tasks.ui.planning.week.start.day"; //$NON-NLS-1$ public static final String PLANNING_ENDHOUR = "org.eclipse.mylyn.tasks.ui.planning.end.hour"; //$NON-NLS-1$ @@ -87,4 +89,12 @@ public static final String PREF_DATA_DIR = "org.eclipse.mylyn.data.dir"; //$NON-NLS-1$ public static final String DEFAULT_ATTACHMENTS_DIRECTORY = "org.eclipse.mylyn.tasks.ui.attachments.defaultDirectory"; //$NON-NLS-1$ + + public static final String SERVICE_MESSAGE_URL = "org.eclipse.mylyn.tasks.ui.servicemessage.url"; //$NON-NLS-1$; + + public static final String LAST_SERVICE_MESSAGE_ID = "org.eclipse.mylyn.tasks.ui.servicemessage.id"; //$NON-NLS-1$ + + public static final String LAST_SERVICE_MESSAGE_ETAG = "org.eclipse.mylyn.tasks.ui.servicemessage.etag"; //$NON-NLS-1$ + + public static final String LAST_SERVICE_MESSAGE_LAST_MODIFIED = "org.eclipse.mylyn.tasks.ui.servicemessage.lastmodified"; //$NON-NLS-1$ } Index: src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java,v retrieving revision 1.131 diff -u -r1.131 TasksUiPlugin.java --- src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java 5 Feb 2010 01:12:35 -0000 1.131 +++ src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java 22 May 2010 21:42:07 -0000 @@ -77,6 +77,7 @@ import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationParticipant; import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant; import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessageManager; import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationReminder; import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotifier; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader; @@ -149,6 +150,8 @@ private RepositoryTemplateManager repositoryTemplateManager; + private ServiceMessageManager serviceMessageManager; + private final Set taskEditorPageFactories = new HashSet(); private final TreeSet repositoryLinkProviders = new TreeSet( @@ -343,6 +346,15 @@ || event.getProperty().equals(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS)) { updateSynchronizationScheduler(false); } + + // TODO: ROB + if (event.getProperty().equals(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)) { + if (getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)) { + serviceMessageManager.start(); + } else { + serviceMessageManager.stop(); + } + } } }; @@ -605,6 +617,17 @@ // make this available early for clients that are not initialized through tasks ui but need access taskListNotificationManager = new TaskListNotificationManager(); + String lastMod = getPreferenceStore().getString( + ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_LAST_MODIFIED); + String etag = getPreferenceStore().getString(ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_ETAG); + + serviceMessageManager = new ServiceMessageManager(getPreferenceStore().getString( + ITasksUiPreferenceConstants.SERVICE_MESSAGE_URL), lastMod, etag); + + if (getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)) { + serviceMessageManager.start(); + } + // trigger lazy initialization new TasksUiInitializationJob().schedule(); } catch (Exception e) { @@ -727,6 +750,7 @@ // ContextCorePlugin.getDefault().getPluginPreferences().removePropertyChangeListener( // PREFERENCE_LISTENER); // } + serviceMessageManager.stop(); taskEditorBloatManager.dispose(PlatformUI.getWorkbench()); INSTANCE = null; } @@ -868,6 +892,7 @@ store.setDefault(ITasksUiPreferenceConstants.PREF_DATA_DIR, getDefaultDataDirectory()); store.setDefault(ITasksUiPreferenceConstants.GROUP_SUBTASKS, true); store.setDefault(ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED, true); + store.setDefault(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED, true); store.setDefault(ITasksUiPreferenceConstants.FILTER_PRIORITY, PriorityLevel.P5.toString()); store.setDefault(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH, true); store.setDefault(ITasksUiPreferenceConstants.EDITOR_CURRENT_LINE_HIGHLIGHT, false); @@ -894,6 +919,8 @@ store.setDefault(ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST, true); store.setDefault(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED, true); + + store.setDefault(ITasksUiPreferenceConstants.SERVICE_MESSAGE_URL, "http://eclipse.org/mylyn/message.xml"); //$NON-NLS-1$ } public static TaskActivityManager getTaskActivityManager() { @@ -1306,4 +1333,8 @@ } } + public ServiceMessageManager getServiceMessageManager() { + return serviceMessageManager; + } + } Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java,v retrieving revision 1.338 diff -u -r1.338 TaskListView.java --- src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java 26 Apr 2010 17:37:32 -0000 1.338 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java 22 May 2010 21:42:07 -0000 @@ -86,6 +86,7 @@ import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListSortAction; import org.eclipse.mylyn.internal.tasks.ui.actions.TaskListViewActionGroup; import org.eclipse.mylyn.internal.tasks.ui.editors.TaskListChangeAdapter; +import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListServiceMessageControl; import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil; import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion; import org.eclipse.mylyn.internal.tasks.ui.util.TaskDragSourceListener; @@ -131,6 +132,7 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Text; @@ -390,6 +392,8 @@ private CustomTaskListDecorationDrawer customDrawer; + private TaskListServiceMessageControl serviceMessageControl; + private final IPageListener PAGE_LISTENER = new IPageListener() { public void pageActivated(IWorkbenchPage page) { filteredTree.indicateActiveTaskWorkingSet(); @@ -730,6 +734,16 @@ @Override public void createPartControl(Composite parent) { + + Composite body = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(1, false); + layout.marginHeight = 0; + layout.marginWidth = 0; + layout.horizontalSpacing = 0; + layout.verticalSpacing = 0; + layout.numColumns = 1; + body.setLayout(layout); + IWorkbenchSiteProgressService progress = (IWorkbenchSiteProgressService) getSite().getAdapter( IWorkbenchSiteProgressService.class); if (progress != null) { @@ -743,7 +757,7 @@ themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager(); themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER); - filteredTree = new TaskListFilteredTree(parent, SWT.MULTI | SWT.VERTICAL | /* SWT.H_SCROLL | */SWT.V_SCROLL + filteredTree = new TaskListFilteredTree(body, SWT.MULTI | SWT.VERTICAL | /* SWT.H_SCROLL | */SWT.V_SCROLL | SWT.NO_SCROLL | SWT.FULL_SELECTION, new SubstringPatternFilter(), getViewSite().getWorkbenchWindow()); // need to do initialize tooltip early for native tooltip disablement to take effect @@ -922,6 +936,11 @@ TasksUiInternal.getTaskList().addChangeListener(TASKLIST_CHANGE_LISTENER); TasksUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(tasksUiPreferenceListener); + serviceMessageControl = new TaskListServiceMessageControl(body); + serviceMessageControl.setServiceMessage(TasksUiPlugin.getDefault() + .getServiceMessageManager() + .getServiceMessage()); + TasksUiPlugin.getDefault().getServiceMessageManager().addServiceMessageListener(serviceMessageControl); // Need to do this because the page, which holds the active working set is not around on creation, see bug 203179 PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPageListener(PAGE_LISTENER); @@ -1263,6 +1282,7 @@ } public void goIntoCategory() { + serviceMessageControl.setHidden(true); ISelection selection = getViewer().getSelection(); if (selection instanceof StructuredSelection) { StructuredSelection structuredSelection = (StructuredSelection) selection; @@ -1280,6 +1300,7 @@ } public void goUpToRoot() { + serviceMessageControl.setHidden(false); drilledIntoCategory = null; drillDownAdapter.goBack(); IActionBars bars = getViewSite().getActionBars(); Index: src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListServiceMessageControl.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,247 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies 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: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.ui.notifications; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; +import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes; +import org.eclipse.mylyn.internal.provisional.commons.ui.GradientCanvas; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.IServiceMessageListener; +import org.eclipse.mylyn.internal.tasks.core.servicemessage.ServiceMessage; +import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; +import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.tasks.ui.TasksUiUtil; +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.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.forms.FormColors; +import org.eclipse.ui.forms.IFormColors; +import org.eclipse.ui.forms.events.HyperlinkAdapter; +import org.eclipse.ui.forms.events.HyperlinkEvent; +import org.eclipse.ui.forms.events.IHyperlinkListener; +import org.eclipse.ui.forms.widgets.Hyperlink; +import org.eclipse.ui.forms.widgets.ImageHyperlink; + +/** + * @author Robert Elves + */ +public class TaskListServiceMessageControl implements IServiceMessageListener { + + private ImageHyperlink imageHyperlink; + + private Hyperlink titleHyperlink; + + private Label descriptionLabel; + + private GridData headData; + + private final Composite parent; + + private GradientCanvas head; + + private ImageHyperlink closeLink; + + private ServiceMessage currentMessage; + + private boolean constructed; + + private String messageUrl; + + public TaskListServiceMessageControl(Composite parent) { + this.parent = parent; + createControl(parent); + } + + private void setTitleImage(Image image) { + imageHyperlink.setImage(image); + } + + private void setTitle(String title) { + titleHyperlink.setText(title); + } + + private void setDescription(String description) { + descriptionLabel.setText(description); + } + + private void addHyperlinkListener(IHyperlinkListener listener) { + titleHyperlink.addHyperlinkListener(listener); + imageHyperlink.addHyperlinkListener(listener); + } + + protected void setMessageUrl(String url) { + messageUrl = url; + } + + public Control createControl(Composite parent) { + FormColors colors = new FormColors(parent.getDisplay()); + head = new GradientCanvas(parent, SWT.NONE); + GridLayout headLayout = new GridLayout(); + headLayout.marginHeight = 0; + headLayout.marginWidth = 0; + headLayout.horizontalSpacing = 0; + headLayout.verticalSpacing = 0; + headLayout.numColumns = 1; + head.setLayout(headLayout); + headData = new GridData(SWT.FILL, SWT.TOP, true, false); + head.setLayoutData(headData); + setHidden(true); + + Color top = colors.getColor(IFormColors.H_GRADIENT_END); + Color bot = colors.getColor(IFormColors.H_GRADIENT_START); + head.setBackgroundGradient(new Color[] { bot, top }, new int[] { 100 }, true); + head.setSeparatorVisible(true); + head.setSeparatorAlignment(SWT.TOP); + + head.putColor(IFormColors.H_BOTTOM_KEYLINE1, colors.getColor(IFormColors.H_BOTTOM_KEYLINE1)); + head.putColor(IFormColors.H_BOTTOM_KEYLINE2, colors.getColor(IFormColors.H_BOTTOM_KEYLINE2)); + head.putColor(IFormColors.H_HOVER_LIGHT, colors.getColor(IFormColors.H_HOVER_LIGHT)); + head.putColor(IFormColors.H_HOVER_FULL, colors.getColor(IFormColors.H_HOVER_FULL)); + head.putColor(IFormColors.TB_TOGGLE, colors.getColor(IFormColors.TB_TOGGLE)); + head.putColor(IFormColors.TB_TOGGLE_HOVER, colors.getColor(IFormColors.TB_TOGGLE_HOVER)); + + Composite informationComp = new Composite(head, SWT.NONE); + informationComp.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));//new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL)); + informationComp.setLayout(new GridLayout(3, false)); + + imageHyperlink = new ImageHyperlink(informationComp, SWT.NONE); + + titleHyperlink = new Hyperlink(informationComp, SWT.WRAP); + setHeaderFontSizeAndStyle(titleHyperlink); + + addHyperlinkListener(new HyperlinkAdapter() { + @Override + public void linkActivated(HyperlinkEvent e) { + if (messageUrl != null) { + TasksUiUtil.openUrl(messageUrl); + } + + } + }); + + closeLink = new ImageHyperlink(informationComp, SWT.NONE); + closeLink.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE)); + GridDataFactory.fillDefaults().align(SWT.END, SWT.BEGINNING).applyTo(closeLink); + closeLink.addHyperlinkListener(new HyperlinkAdapter() { + @Override + public void linkActivated(HyperlinkEvent e) { + closeMessage(); + + } + + }); + + new Label(informationComp, SWT.NONE); + + descriptionLabel = new Label(informationComp, SWT.WRAP); + GridDataFactory.swtDefaults().span(2, 1).applyTo(descriptionLabel); + constructed = true; + return head; + } + + private void closeMessage() { + if (currentMessage != null) { + setHidden(true); + TasksUiPlugin.getDefault().getPreferenceStore().setValue( + ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_ID, currentMessage.getId()); + } + } + + public void setHidden(boolean hidden) { + headData.exclude = hidden; + if (constructed) { + parent.layout(true); + } + } + + // From EditorUtil + private static Font setHeaderFontSizeAndStyle(Control text) { + float sizeFactor = 1.2f; + Font initialFont = text.getFont(); + FontData[] fontData = initialFont.getFontData(); + for (FontData element : fontData) { + element.setHeight((int) (element.getHeight() * sizeFactor)); + element.setStyle(element.getStyle() | SWT.BOLD); + } + final Font textFont = new Font(text.getDisplay(), fontData); + text.setFont(textFont); + text.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + textFont.dispose(); + } + }); + Color color = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getColorRegistry().get( + CommonThemes.COLOR_COMPLETED); + text.setForeground(color); + return textFont; + } + + public void setServiceMessage(final ServiceMessage message) { + if (message != null) { + String lastMessageId = TasksUiPlugin.getDefault().getPreferenceStore().getString( + ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_ID); + TasksUiPlugin.getDefault().getPreferenceStore().setValue( + ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_ETAG, message.getETag()); + TasksUiPlugin.getDefault().getPreferenceStore().setValue( + ITasksUiPreferenceConstants.LAST_SERVICE_MESSAGE_LAST_MODIFIED, message.getLastModified()); + + boolean displayForCurrentMylynVersion = true; + + if (message.getMylynVersion() != null && !message.getMylynVersion().equals("")) { //$NON-NLS-1$ + + MylynVersion version = new MylynVersion(message.getMylynVersion()); + String versionString = (String) TasksUiPlugin.getDefault().getBundle().getHeaders().get( + "Bundle-Version"); //$NON-NLS-1$ + MylynVersion versionInstalled = new MylynVersion(versionString); + + displayForCurrentMylynVersion = (versionInstalled.compareTo(version) <= 0); + } + + if (displayForCurrentMylynVersion && !lastMessageId.equals(message.getId()) + && !message.getId().equals("-1")) { //$NON-NLS-1$ + currentMessage = message; + Display.getDefault().asyncExec(new Runnable() { + + public void run() { + if (!head.isDisposed()) { + if (message != null) { + setTitle(message.getTitle()); + setDescription(message.getDescription()); + setTitleImage(Dialog.getImage(message.getImage())); + setHidden(false); + setMessageUrl(message.getUrl()); + } else { + setHidden(true); + } + } + + } + }); + } + } else { + setHidden(true); + } + } + +} Index: src/org/eclipse/mylyn/internal/tasks/ui/notifications/MylynVersion.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/notifications/MylynVersion.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/notifications/MylynVersion.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/notifications/MylynVersion.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright (c) 2004, 2009 Eugene Kuleshov 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: + * Eugene Kuleshov - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.ui.notifications; + +/** + * Mylyn version holder (derived from JiraVersion) + * + * @author Eugene Kuleshov + * @author Thomas Ehrnhoefer + */ +public class MylynVersion implements Comparable { + + private final int major; + + private final int minor; + + private final int micro; + + private final String qualifier; + + public MylynVersion(String version) { + String[] segments = version == null ? new String[0] : version.split("\\."); //$NON-NLS-1$ + major = segments.length > 0 ? parse(segments[0]) : 0; + minor = segments.length > 1 ? parse(segments[1]) : 0; + micro = segments.length > 2 ? parse(segments[2]) : 0; + if (segments.length <= 3) { + qualifier = ""; //$NON-NLS-1$ + } else { + qualifier = segments.length == 0 ? "" : segments[3]; //$NON-NLS-1$ + } + } + + private int parse(String segment) { + try { + return segment.length() == 0 ? 0 : Integer.parseInt(segment); + } catch (NumberFormatException e) { + return 0; + } + } + + public boolean isSmallerOrEquals(MylynVersion v) { + return compareTo(v) <= 0; + } + + public int compareTo(MylynVersion v) { + if (major < v.major) { + return -1; + } else if (major > v.major) { + return 1; + } + + if (minor < v.minor) { + return -1; + } else if (minor > v.minor) { + return 1; + } + + if (micro < v.micro) { + return -1; + } else if (micro > v.micro) { + return 1; + } + + // qualifier is not needed to compare with min version + return qualifier.compareTo(v.qualifier); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Integer.toString(major)); + sb.append(".").append(Integer.toString(minor)); //$NON-NLS-1$ + if (micro > 0) { + sb.append(".").append(Integer.toString(micro)); //$NON-NLS-1$ + } + if (qualifier.length() > 0) { + sb.append(".").append(qualifier); //$NON-NLS-1$ + } + return sb.toString(); + } + +}